Models

I Models sono la rappresentazione PHP di una tabella e le sue interazioni.

Esempio la tabella users è collegata alla classe User (notare maiuscole-minuscole e plurale-singolare); in questo caso Laravel capisce in automatico che le 2 entità sono collegate.

Nel caso la classe debba far riferimento ad un’altra tabella bisogna aggiungere la proprietà protetta $table. Anche la primary key è default cioè id; nel caso non fosse così bisogna aggiungere la proprietà protetta $primaryKey.

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $table = 'gallery_user';
    protected $primaryKey = 'gallery_user_id';

    ...
}

Ho creato un nuovo model app\Models\Album.php collegata alla tabella albums.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Album extends Model{
    
}

Non c’è bisogno di altro codice php per leggere i dati; è sufficiente creare una route che richiama la classe, il metodo magico all() e Laravel mostra a video un JSON con tutti i dati.

use App\Models\Album;

Route::get('/albums', function(){
    return Album::all();
});

Factory

Le factory sono classi che si occupano di costruire istanze di particolari modelli inserendo dei dati di test nelle loro property.

Francamente non capisco l’utilità di queste classi; il medesimo risultato si può ottenere usando i file seed inserendo al loro interno del codice PHP simile; la pulizia del codice ne risente (vedi esempi sotto) ma per popolare le tabelle sarà richiamato comunque il comando per lanciare il seed.

file seed UserTableSeed.php

# metodo normale 1
$sql = "INSERT INTO users (name, email, password) VALUES (:name, :email, :password)";
for ($i=0; $i<30; $i++){
    DB::statement($sql, [
        'name' => Str::random(10),
        'email' => Str::random(10).'@gmail.com',
        'password' => Hash::make('password')
    ]);
}

# metodo normale 2
for ($i=0; $i<30; $i++){
    DB::table('users')->insert([
        'name' => Str::random(10),
        'email' => Str::random(10).'@gmail.com',
        'password' => Hash::make('password'),
        'created_at' => Carbon::now()
        ]
    );
}

# uso della factory
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
User::truncate();
factory(User::class, 30)->create();