如何使用 Faker 在 Laravel 中建立多个关系

jud*_*ane 1 php faker laravel eloquent laravel-seeding

我有一个包含两列、品牌和商店的数据库。每个品牌都可以欠几家商店,我想使用 Laravel 通过 Fakers 为我的数据库做种子。

所以在模型中设置迁移和关系之后

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Brand extends Model
{

    /**
     * Get the shops for the brand.
     */
    public function shops()
    {
        return $this->hasMany('App\Shop','sh_brand_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

和:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Shop extends Model
{
    public function user() {
        return $this->belongsTo('App\Brand','sh_brand_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用工厂来为数据库做种。

<?php

use Faker\Generator as Faker;

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

    return [
        'name' => $faker->company,
        'address' => $faker->address,
    ];
});
Run Code Online (Sandbox Code Playgroud)

use Faker\Generator as Faker;

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

        return [
            'name' => $faker->company,
            'logo_url' => $faker->imageUrl(640, 480),
            'website' => $faker->url,
            'description' => $faker->text(500),
            'telephone_number' =>'31'. $faker->randomNumber(8),
            'principal_address' => $faker->address,
            'email' => $faker->unique()->safeEmail,
        ];
    });
Run Code Online (Sandbox Code Playgroud)

最后我需要使用这些工厂为数据库做种。网站上有文档和很多例子,但我找到的每个解决方案都让我只为每个品牌生成一个商店,我想为每个品牌生成许多商店。

做这个的最好方式是什么?

Eri*_*rin 6

直接把它放在你的工厂里。我使用辅助方法getInstanceOf来选择另一个模型的随机实例。

use Faker\Generator as Faker;
use App\Brand;
use App\Shop;

function getInstanceOf($class, $returnIdOnly = true) {
    $instance = $class::inRandomOrder()->first() ?? factory($class)->create();
    return $returnIdOnly ? $instance->id : $instance;
}

$factory->define(Shop::class, function (Faker $faker) {
   return [
       'name' => $faker->company,
       'address' => $faker->address,
       'sh_brand_id' => getInstanceOf(Brand::class)
   ];
});
Run Code Online (Sandbox Code Playgroud)

然后在播种时,

factory(App\Brand::class, 10);
factory(App\Shop::class, 50);
Run Code Online (Sandbox Code Playgroud)