---
# System prepended metadata

title: Workshop Laravel HE-Arc DevWeb - Notes pour conclure
tags: [workshop, laravel, hearc, devweb]

---

###### tags: `laravel` `workshop` `devweb` `hearc`
# Workshop Laravel HE-Arc DevWeb - Notes pour conclure

Suite au workshop, il y a encore un point que j'aurais aimé aborder avec vous et qui me semble important car vous allez tous le rencontrer dans vos projets. Il s'agit des relations entres 2 tables ou plus. Et je vous montre aussi rapidement comment utiliser des icones (améliore le style de l'app).

Ce qui suit sont mes notes de cours que j'ai réécrite pour l'occasion. Evidement les explications ne seront pas aussi complète que pendant le workshop. Ceci est un point de départ qui vous permettera de voir comment créer des relations, mais il faudra que vous creusiez un peu plus.

## Relation

Ajouter le modèle Author
- `php artisan make:model Author --migration`
> `--migration` peut être remplacé par `-m`
- Ajouter un champ name à Author

Relier Book et Author
- Refaire une migration pour ajouter la FK (Foreign Key) à Book
`php artisan make:migration add_author_fk_to_books --table=books`
```php=
public function up()
{
    Schema::table('books', function (Blueprint $table) {
        $table->foreignId('author_id')->nullable()->constrained()->onDelete('cascade');
    });
}

public function down()
{
    Schema::table('books', function (Blueprint $table) {
        $table->dropForeign(['author_id']);
        $table->dropColumn('author_id');
    });
}
```
> Toujours vérifier que le down fonctionne

> Séparer la responsabilité des migrations le plus possible pour simplifier la scalabilité et ne jamais modifier une migration déjà poussée sur le répo git du projet !

Afficher les auteurs sur la page index, si pas d'auteur afficher un message pour l'indiquer

- Relier Book et Author dans leur modèle
```php=
public function books()
{
    return $this->hasMany(Book::class);
}


function author() {
    return $this->belongsTo(Author::class);
}
```

- Ajouter la FK au tableau fillable de Book (modèle)

Utiliser Author sur `index`

- Générer 3 utilisateurs depuis phpmyadmin
> Accessible depuis locahost:8081 si la config docker de base à été conservée et respectée

- Ajouter author sur la page index
- Ajouter un petit message indiquant qu'aucun author existe si author est à null sur la page index

```htmlembedded=
<td>{{ $book->author_id ?? "Auteur inconnu..." }}</td>
```
> C'est quoi ça : "??"
> ```php=
> $foo = $bar ?? 'something';
> $foo = isset($bar) ? $bar : 'something';
> ```
> Source : https://stackoverflow.com/questions/53610622/what-does-double-question-mark-operator-mean-in-php

Afficher le nom de l'Author et pas juste son id
- Modifier BookController.index
```php=
$books = Book::with('author')->latest()->paginate(5);
```
> Il est important d'utiliser `with` pour éviter tout se qui est Select N+1. Aller se documenter sur le problème du Select N+1 et voir comment le résoudre avec Laravel. `with` ne suffit pas toujours, ne pas se contenter de ça.

Permettre l'ajout d'un auteur dans `create`
- Envoyer les Authors sur la page `create` via BookController.index
```php=
public function create()
{
    $authors = Author::all();
    return view('books.create', compact('authors'));
}
```

- Ajouter un champs type select et afficher les Author
```htmlembedded=
<div class="form-group col-12">
    <label for="exampleFormControlSelect1">Auteur</label>
    <select class="form-control" name="author_id" id="exampleFormControlSelect1">
        <option>Auteur inconnu...</option>
        @foreach ($authors as $author)
        <option>{{$author->name}}</option>
        @endforeach
    </select>
</div>
```
- Tester le form de création avec les auteurs
- Améliorer le Select pour conserver l'Author en cas d'erreur du form
```htmlembedded=
<div class="form-group col-12">
    <label for="exampleFormControlSelect1">Auteur</label>
    <select class="form-control" name="author_id" id="exampleFormControlSelect1">
        <option value="">Auteur inconnu...</option>
        @foreach ($authors as $author)
        <option value="{{$author->id}}" {{ (old("author_id") == $author->id ? "selected":"") }}>{{$author->name}}</option>
        @endforeach
    </select>
</div>
```
- Tester le form à nouveau
- Ajouter la validation du champs Author
```php=
'author_id' => 'nullable|integer|exists:authors,id'
```
- Tester le form finale

## Dernières touches de style

Ajouter des icones sur l'application
- Ajouter le CDN de Bootstrap Icon
https://blog.getbootstrap.com/2021/01/07/bootstrap-icons-1-3-0/
- Ajouter des icones ou cela est pertinent sur l'app
- D'autre solutions pour des icones existent, celle que je vous propose ici n'est pas forcément la meilleure, aller voir si il n'y à pas mieux en ligne.
