2013-02-02 56 views
14

L4の新しいシード機能で多対多リレーションシップを簡単に管理できますか?Laravel 4:シードでの関係を使って作業する

1つの方法は、ピボットテーブルの種を作ることですが、私は多くの作業が必要です。

このような作業の良いワークフローに関する考えはありますか?

答えて

41

Laravel 4の最新バージョンでは、すべてのシードスクリプトが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;'); 
} 

すべてのシーディングを実行する前後で、外部キーの制約を無効にすることがわかります。これは悪い習慣かもしれませんが、各テーブルのIDカウントを再設定するためにtruncate関数を使用することができる唯一の方法です。 inserting related modelsのガイドに従えば、この練習は不要かもしれません。

class PrimaryTableOneSeeder extends Seeder { 

public function run() 
{ 
    DB::table('primaryone')->truncate(); 
    Primaryone::create(array(
     'field' => 'value', 
     'created_at' => new DateTime, 
     'updated_at' => new DateTime 
    )); 
} 

私は私の例でやっているようmass assignmentを使用すると、ドキュメントの最新バージョンがするように、あなたは、モデルのためのいくつかの警備や充填可能な列のいずれかを指定する必要があります。これを行うには、次のようにモデルにプロパティを追加するだけです。

class Primaryone extends Eloquent { 

protected $guarded = array('id'); 
+1

これはほぼ正しい答えだと思います。もし私があなただったら私は外国の鍵の小切手を無効にしません。 テーブルを切り捨てることも良いと言えます。私はそれをしないだろうが、それは私だけです。その理由は、db:seedはいつでも実行できるため、dbに重要なデータがある可能性があるからです。 – AndHeiberg

+1

@AndHeibergそれは良い点です。すべての人は、シードは生産に使用することを意図しているのではなく、テストデータを含む開発データベースをシードするためのものであることを認識していません。プロダクション用のデータは、アプリケーション独自のインタフェースまたはssh db接続を介して追加する必要があります。 – isimmons

+0

sqliteと互換性のあるメソッドはありますか? 'SET FOREIGN_KEY_CHECKS'はsqliteでエラーを引き起こします。これは私の問題が起きたところです。私はdevieのquickie sqlite dbで作業していましたが、今はsqliteの寛容さがいくつかの問題を隠していることを知るためにpostgresに移行しようとしています。 –

0

シードイングは、シンプルな情報、テストデータ、および静的情報です。私は関係を扱うためにそれを使用することをお勧めしません。個人的には、アプリケーションをテストするのに役立つように、テーブルあたり2〜3レコードしか使用しません。

アプリケーションを開発する場合は、まずデータ入力(管理)領域で作業し、次にフロントエンドで作業することを検討してください。これにより、テストデータを簡単に追加できます。

+1

私は同意しますが、簡単なデータ入力があっても、依然として重要で有用です。あなたが管理者の入力を種に変換する何らかの方法がない限り、これは本当に私の質問に答えていますか? – AndHeiberg

3

Laravelシードファイルは、通常のPHPスクリプトです(ただし、配列を返す必要があります)。シードファイルでデータベースを照会することができます(Eloquent、Fluent Builder、またはPDOを使用)。

多対多の問題に取り組む1つの方法は、ピボットテーブルが最後に読み込まれるようにシードファイルを意図的に指定することです。たとえば、ファイル名に数値を付加することができます。 php、2_books.php、3_authors_books.phpなど)。 Artisanはファイル名をアルファベット順にソートしてから実行します。

Laravel 4 database seedingに小さなチュートリアルを投稿しました。また、seedingの公式文書を参照することもできます。