2015-09-06 13 views
7

モデルファクトリでの外部キーの定義方法を教えてください。私の団体・テーブル・シーダでモデル工場のLaravel 5.1外部キー

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => 197, 
    ]; 
}); 

を:私は国のテーブルへの外部キーを持っている組織テーブルを持っている場合たとえば、私のモデル工場で、私は次のように国IDのためのダミー値を定義するために抱えていますクラス私は次のことをしていますが、フェイカーオブジェクトは存在しません - 私のシーダークラスに新しいフェイカーオブジェクトを作成する必要がありますか?モデル工場を定義する際に外部キーを定義するための

use Illuminate\Database\Seeder; 

class OrganisationsTableSeeder extends Seeder 
{ 

    public function run() 
    { 
     $countryIds = Country::lists('id')->all(); 

     factory('App\Organisation', 3)->create([ 
     // override factory default 
     'country_id' => $faker->randomElement[$countryIds], 
    ]); 
    } 
} 

データベースシーダクラス

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 

     Model::unguard(); 

     $this->call('CountriesTableSeeder'); 
     $this->call('OrganisationsTableSeeder'); 

     Model::reguard(); 
    } 
} 

いただきまし最良の方法は?モデルファクトリからcountry_idを省略してシードクラスに追加することは可能ですか?モデルファクトリで定義されている既存の値をオーバーライドするだけで、シードクラスを介して新しい値を追加することはできません私が間違っているなら私?

答えて

2

私は少し遅れているかもしれませんが、私は同じ問題を抱えていました。あなたは

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => factory(App\Country::class)->create()->id, 
    ]; 
}); 

、その後、あなたの子孫にあなただけの

factory(App\Organisation::class, 5)->create(); 

を呼び出す必要がありますを行うことができる必要があり、それは同様にあなたのために国を作成します。

+3

問題でこの解決策は、それぞれの「組織」が1つの異なる国を持ち、既存の組織を使用しないことです。 –

+0

mmmmh、私はこのコードを書いてからしばらくしていますが、あなたの所見は正しいようですが、私が書いた時に既存の国を使うのは本当に気にしませんでした。 –

0

Laravelチーム、Otwell、Stauffer et al。が提案している方法は、このようなものです。

テスト>Adding Relations To Models

Adding relationships to your models

ModelFactory.php

$factory->define(App\Organisation::class, function ($faker) { 
    return [ 
     'name' => $faker->company, 
     'country_id' => 197, 
    ]; 
}); 

$factory->define(App\Country::class, function ($faker) { 
    return [ 
     'name' => $faker->country, 
    ]; 
}); 

シーダ

$organisations = factory('App\Organisation', 3) 
    ->create() 
    ->each(function($$organisation) { 
     $organisation->relatedItems()->save(factory('App\Country')->make()); 
    });