2016-03-17 50 views
2

我想種子與外鍵的表,我堅持我如何告訴模型隨機拉什麼已經存在的值。laravel模型工廠種子從現有的生成

ModelFactory

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

$factory->define(App\Device::class, function(Faker\Generator $faker) { 
    return [ 
     'vendor' => , 
     'name' => $faker->company, 
     'mac_address' => $faker->macAddress, 
    ]; 
}); 

種子

VendorTableSeeder

public function run() 
{ 
    factory(App\Vendor::class, 150)->create(); 
} 

DeviceTableSeeder

public function run() 
{ 
    factory(App\Device::class, 50)->create(); 
} 

DataSeeder

$this->call(VendorTableSeeder::class); 
$this->call(DeviceTableSeeder::class); 

我的設備表之前種子Vendor表,並希望從現有供應商填充隨機商ID。

'vendor' => 'factory::App\Vendor' 

但我正在逐漸

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: foreign key constraint fails 

它看起來像刀片試圖插入factory::App\Vendor作爲供應商列中輸入字符串。我正試圖弄清楚如何從現有的供應商那裏得到它。

回答

2

VendorTableSeeder同時播種它們。

你會需要沒有供應商的設備嗎?或供應商沒有設備?如果沒有,那麼這是最好的選擇。相關的表格應該一起播種。

一個更好的例子是學校。學校是主要的種子,每個學校你還可以培養一名校長,幾名教師和100名學生。如果你一次種下它們,消除了外鍵或訂購的顧慮。

factory(App\Vendor::class, 150) 
    ->create() 
    ->each(function (App\Vendor $vendor) { 
     $vendor->devices()->save(
      factory(App\Device::class)->make() 
     ); 

     // For some randomness 
     $vendor->devices()->save(
      factory(App\Device::class, rand(0, 4))->make() 
     ); 
    }); 

如果你確實希望分開播種他們的靈活性,那麼你有其他選擇。您可以在設備工廠內部隨機選擇一個供應商。

$factory->define(App\Device::class, function(Faker\Generator $faker) { 

    // Grab a random vendor 
    $vendor = App\Vendor::orderByRaw('RAND()')->first(); 

    // Or create a new vendor 
    $vendor = factory(App\Vendor::class)->create(); 

    return [ 
     'vendor_id' => $vendor->id, 
     'name'  => $faker->company, 
     'mac_address' => $faker->macAddress, 
    ]; 
}); 

或者您可以傳遞與工廠生成的屬性合併的額外屬性。

// $vendor is a Vendor object 

factory(App\Device::class, 50)->create([ 
    'vendor_id' => $vendor->id, 
]); 
0

這是我如何用我的地址做的,我做了這樣的時間的10%,這將創建一個新的地址,否則使用隨機一個。

// Grab a random address 
$address = App\Address::orderByRaw('RAND()')->first(); 

// 10% that we will generate a new address 
if ($faker->boolean(10) || !$address) 
{ 
    $address = factory(App\Address::class)->create(); 
} 

基本上我搶一個隨機地址,如果存在有一個是有10%的機會,$faker->boolean(10)將返回true,它會產生一個新的地址。但是,如果沒有地址($address == false),我們總是生成一個新的。