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();