Nella versione più recente di Laravel 4 si definisce l'ordine in cui tutti gli script di seminatrice vengono eseguiti nel metodo "run" della classe DatabaseSeeder.
public function run()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call('PrimaryTableOneSeeder');
$this->command->info('The first primary table has been seeded!');
$this->call('PrimaryTableTwoSeeder');
$this->command->info('The second primary table has been seeded!');
$this->call('PivotTableSeeder');
$this->command->info('The pivot table has been seeded!');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
Si noterà che disabilito i vincoli di chiave esterna prima e dopo aver eseguito tutti i miei seeding. Questa potrebbe essere una cattiva pratica, ma è l'unico modo in cui posso usare la funzione truncate per reimpostare il conteggio id per ogni tabella. Se segui la guida su inserting related models questa pratica potrebbe non essere necessaria.
class PrimaryTableOneSeeder extends Seeder {
public function run()
{
DB::table('primaryone')->truncate();
Primaryone::create(array(
'field' => 'value',
'created_at' => new DateTime,
'updated_at' => new DateTime
));
}
Per utilizzare mass assignment come sto facendo nel mio esempio e come la versione più recente della documentazione fa, sarà necessario specificare alcune colonne custoditi o compilabili per il modello. Per fare ciò è sufficiente aggiungere proprietà al modello in questo modo:
class Primaryone extends Eloquent {
protected $guarded = array('id');
Direi che questa è quasi la risposta giusta. Se fossi in te non disabiliterei i controlli delle chiavi esterne. Può essere discusso se è bene troncare anche le tabelle. Non lo farei, ma quello sono solo io. Il motivo è che db: seed può essere eseguito in qualsiasi momento, il che significa che il db potrebbe contenere dati importanti. – AndHeiberg
@AndHeiberg Questo è un buon punto. Tutti non sono consapevoli del fatto che le sementi non sono pensate per essere utilizzate nella produzione, ma piuttosto per seminare un database di sviluppo con dati di test che va bene se viene troncato. I dati per la produzione dovrebbero essere aggiunti tramite l'interfaccia dell'applicazione o tramite una connessione ssh db. – isimmons
Esiste un metodo compatibile con sqlite? 'SET FOREIGN_KEY_CHECKS' genera un errore con sqlite.È qui che nasce il mio problema: ho lavorato con un quickie sqlite db per dev e sto cercando di passare a postgres, solo per scoprire che la clemenza di sqlite nascondeva una serie di problemi. –