Lekcja będąca wstępem do zabawy modelami w Laravelu. Trochę teorii, później będzie już tylko ciekawiej. Do dzieła.

Pamiętamy fillable? Było nam potrzebne żeby móc robić tzw. mass assignment:

class Person extends Model
{
    protected $fillable = ['firstName', 'lastName', 'age'];

    use HasFactory;

}

Czasami zamiast tego korzystamy z $guarded (i tam mamy listę tych kolumn, których nie pozwalamy użytkownikowi wpisywać), koniec końców ja wolę fillable.

Ok, a co jeśli nasza tabela i model mają nazwy niezgodne z konwencjami nazewniczymi Laravela i nie potrafi się domyślić jaka jest nazwa tabeli po nazwie modelu?

class Flight extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_flights';
}

Mamy też rozwiązanie na dziwnie nazwane primary_key:

class Flight extends Model
{
    /**
     * The primary key associated with the table.
     *
     * @var string
     */
    protected $primaryKey = 'flight_id';
}

A nawet na niestandardowy typ klucza głównego:

<?php
 
class Flight extends Model
{
    /**
     * The data type of the primary key ID.
     *
     * @var string
     */
    protected $keyType = 'string';
}

Laravel zawsze zakłada, że created_at i updated_at są obecne ($table->timestamps() w migracji). Jeżeli ich nie ma, musimy to dookreślić:

class Flight extends Model
{
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;
}

A może są, ale inaczej nazwane? Też nie ma problemu:

<?php
 
class Flight extends Model
{
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'updated_date';
}

Niektóre modele mogą używać innego połączenia niż reszta (która używa domyślnego połączenia, mamy je w .env) i to też trzeba określić:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class Flight extends Model
{
    /**
     * The database connection that should be used by the model.
     *
     * @var string
     */
    protected $connection = 'mysql';
}

Ok, więcej o modelach w następnych lekcjach.