2013-02-02 10 views
14

C'è un modo semplice per gestire le relazioni molti-a-molti nella nuova funzione di semi di L4?Laravel 4: Lavorare con le relazioni nelle sementi

Un modo sarebbe quello di fare un seme per il tavolo pivot, ma mi piacerebbe molto lavoro.

Qualche idea su un buon flusso di lavoro per questo genere di cose?

risposta

41

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'); 
+1

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

+1

@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

+0

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. –

0

La semina è per informazioni semplici, dati di test e informazioni statiche. Non consiglierei di usarlo per gestire le relazioni. Personalmente, lo uso solo per 2 o 3 record per tabella, per aiutare a testare la mia applicazione.

Quando si sviluppa la propria applicazione, pensare di lavorare nell'area di immissione dei dati (admin) prima del front end. In questo modo puoi facilmente aggiungere dati di test.

+1

Sono d'accordo, ma anche quando si dispone di una semplice immissione di dati la semina è ancora importante e utile. Quindi, a meno che tu non abbia un modo di convertire l'input dell'amministratore in semi, questo è davvero rispondere alla mia domanda? – AndHeiberg

3

I file di file di laravel sono script PHP standard (tranne che devono restituire un array). Puoi interrogare il database in file seme (usando Eloquent, Fluent builder o anche PDO).

Un modo per affrontare il problema molti-a-molti è quello di assegnare intenzionalmente i file seme in modo che la tabella pivot sia stata compilata per l'ultima volta ... Ad esempio, è possibile anteporre un valore numerico al nome del file (ad esempio 1_autori. php, 2_books.php, 3_authors_books.php ecc.). Artisan ordina i nomi dei file in ordine alfabetico prima di eseguirli.

Ho pubblicato un piccolo tutorial su Laravel 4 database seeding - questo dovrebbe farti andare. Inoltre, è possibile consultare il documento ufficiale su seeding.