【问题标题】:How to seed multiple relationships in Laravel with Faker如何使用 Faker 在 Laravel 中播种多个关系
【发布时间】:2018-09-10 01:49:55
【问题描述】:

我有一个包含品牌和商店两列的数据库。每个品牌可以欠几家商店,我想使用 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');
    }
}

还有:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

<?php

use Faker\Generator as Faker;

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

    return [
        'name' => $faker->company,
        'address' => $faker->address,
    ];
});

和

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,
        ];
    });

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

最好的方法是什么?

【问题讨论】:

    标签: php laravel eloquent faker laravel-seeding


    【解决方案1】:

    我找到了适合我的解决方法:

    <?php
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder {
    
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run() {
            factory(App\Brand::class, 50)->create() 
                    ->each( 
                        function ($br) {
                            factory(App\Shop::class, 10)->create()
                                    ->each(
                                        function($sh) use (&$br) { 
                                            $br->shops()->save($sh)->make();
                                        }
                                    );
                        }
                    );
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      直接放在你的工厂里。我使用辅助方法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)
         ];
      });
      

      那么在播种的时候,

      factory(App\Brand::class, 10);
      factory(App\Shop::class, 50);
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2017-08-29
        • 1970-01-01
        • 2018-05-26
        • 2018-09-03
        • 2017-12-29
        • 2019-01-05
        • 2019-01-17
        • 2020-10-08
        相关资源
        最近更新 更多