Laravel : c’est quoi les variables $table et $fillable dans un modèle

Dans Laravel, les modèles sont utilisés pour représenter les données stockées dans une table de base de données. D’ailleurs, si vous voulez en apprendre plus les modèles dans Laravel, je vous conseille d’aller voir de cet article. Les variables $table et $fillable sont utilisées pour définir la table de base de données correspondante et les colonnes qui peuvent être massivement assignées, le mass assignment.

Mais c’est quoi le mass assignment ? Le mass assignment est un moyen pratique de remplir rapidement les propriétés d’un modèle avec des données provenant d’un tableau associatif, sans avoir à spécifier chaque propriété individuellement. Avec Laravel, cela se fait généralement en utilisant la méthode create ou fill sur un modèle. On va voir ça en détails dans la suite pour expliquer ce concept de $table et $fillable dans les modèles.

Que sont les variables $table et $fillable dans un modèle ?

Supposons que vous ayez une application de blog qui stocke des articles dans une table de base de données appelée articles. Vous pouvez créer un modèle Article qui représente les données classiques d’un article de blog basique stockées dans cette table :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $table = 'articles';

    protected $fillable = [
        'title',
        'body',
        'published_at',
    ];
}

Dans l’exemple ci-dessus, nous avons défini la variable $table pour spécifier que le modèle Client est lié à la table clients. Nous avons également défini la variable $fillable pour indiquer les colonnes qui peuvent être massivement assignées dans ce modèle. Dans cet exemple, nous avons autorisé la valeur des colonnes name, email et password à être utilisées en utilisant le mass assignment.

À titre d’exemple, nous pouvons également utiliser la variable $guarded pour spécifier les colonnes qui ne doivent pas être massivement assignées. Maintenant, nous allons faire un modèle de clients simple avec un nom, un email et un mot de passe. Ce modèle serait alors le suivant :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Client extends Model
{
    protected $table = 'clients';

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $guarded = [
        'id',
        'created_at',
        'updated_at',
    ];
}

Dans cet exemple, nous avons défini la variable $guarded pour spécifier que les colonnes id, created_at et updated_at ne doivent pas être massivement assignées.

Avec ces variables $fillable et $guarded définies, vous pouvez utiliser le modèle Client pour stocker et récupérer les données des clients dans votre base de données. Par exemple, pour créer un nouveau client, vous pouvez utiliser la méthode create :

<?php

$client = Client::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => bcrypt('password'),
]);

Les champs id, created_at et updated_at sont gérés automatiquement par Laravel lors de la création et de la mise à jour d’un modèle. Lorsqu’un enregistrement de votre base de données est créé ou mis à jour en passant par le modèle, Laravel remplit renseigne tout seul les champs created_at et updated_at avec la date et l’heure actuelles.

Il est important de noter que cette fonctionnalité est activée par défaut pour tous les modèles dans Laravel, à moins que vous ne la désactiviez explicitement en définissant la variable $timestamps sur false dans le modèle.

Pour résumer très simplement :

  • $table vous permet de renseigner la table qui sera utilisée par le modèle.
  • $fillable indique les colonnes qui seront utilisées par votre modèle, il est important de faire attention de ne pas en oublier sinon vous pourrez avoir une erreur lors d’une tentative d’insertion.

En prenant soin de bien renseigner ces deux variables vous allez alors pouvoir facilement utiliser les fonctions firstOrCreate ou updateOrCreate de Laravel qui sont très pratique !

Laisser un commentaire