L4の新しいシード機能で多対多の関係を管理する簡単な方法はありますか?
1つの方法は、ピボットテーブルのシードを作成することですが、私は多くの作業を行います。
この種のことのための良いワークフローについて何か考えはありますか?
L4の新しいシード機能で多対多の関係を管理する簡単な方法はありますか?
1つの方法は、ピボットテーブルのシードを作成することですが、私は多くの作業を行います。
この種のことのための良いワークフローについて何か考えはありますか?
Laravel 4 の最新バージョンでは、すべてのシーダー スクリプトが実行される順序を DatabaseSeeder クラスの "run" メソッドで定義します。
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;');
}
すべてのシードを実行する前後に、外部キー制約を無効にしていることに気付くでしょう。これは悪い習慣かもしれませんが、truncate 関数を使用して各テーブルの ID カウントを再設定する唯一の方法です。関連モデルの挿入に関するガイドに従っている場合、この方法は不要な場合があります。
class PrimaryTableOneSeeder extends Seeder {
public function run()
{
DB::table('primaryone')->truncate();
Primaryone::create(array(
'field' => 'value',
'created_at' => new DateTime,
'updated_at' => new DateTime
));
}
私の例で行っているように、またドキュメントの最新バージョンで行っているように一括代入を使用するには、モデルに対して保護された列または入力可能な列を指定する必要があります。これを行うには、次のようにモデルにプロパティを追加するだけです。
class Primaryone extends Eloquent {
protected $guarded = array('id');
Laravel シード ファイルは、通常の PHP スクリプトです (ただし、配列を返す必要があります)。シード ファイルでデータベースにクエリを実行できます (Eloquent、Fluent ビルダー、さらには PDO を使用)。
多対多の問題に取り組む 1 つの方法は、シード ファイルに意図的に名前を付けて、ピボット テーブルが最後に入力されるようにすることです。たとえば、ファイル名の先頭に数値を追加できます (つまり、1_authors.php、2_books. php、3_authors_books.php など)。Artisan は、ファイル名を実行する前にファイル名をアルファベット順に並べ替えます。
Laravel 4 データベースのシード処理に関する小さなチュートリアルを投稿しました。さらに、シードに関する公式ドキュメントを参照することもできます。
シードは、単純な情報、テスト データ、および静的情報用です。関係を処理するために使用することはお勧めしません。個人的には、アプリケーションのテストに役立てるために、テーブルごとに 2 つまたは 3 つのレコードに対してのみ使用します。
アプリケーションを開発するときは、最初にデータ入力 (管理) 領域で作業し、次にフロント エンドで作業することを考えてください。これにより、テスト データを簡単に追加できます。