【问题标题】:laravel database seeder adding add foreign key id randomly to seedslaravel 数据库播种器添加随机添加外键 id 到种子
【发布时间】:2020-02-12 00:23:14
【问题描述】:

我正在尝试创建播种机用于测试目的。我有通过房间 ID 属于房间的用户,这些房间是通过房间播种器创建的,在我的用户播种器中,我创建一个用户并像这样更新 room_id 属性,

factory(App\User::class, 150)->create([
        'host' => false,
        'room_id' =>  App\Room::inRandomOrder()->first()->id
    ]);

我的问题是这里生成的所有用户都获得相同的房间 ID,如何真正从数据库中获取随机房间 ID 并在我的播种机中使用它?

【问题讨论】:

  • App\Room::all()->random()->id 重复? stackoverflow.com/questions/13917558/…
  • 您可以使用rand 从数据库中获取随机ID。
  • @BigA 不是问如何获得随机数,我是在问为什么我的随机数不是随机的,而是为每个创建的用户分配相同的 ID,即使它有 30 多个 IDS 可供选择。

标签: php laravel laravel-seeding


【解决方案1】:

试试:

App\Room::all()->random()->id

【讨论】:

    【解决方案2】:
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = factory(\App\User::class, 150)->create([
            'host' => false,
            'room_id' => $this->getRandomRoomId()
        ]);
    }
    
    private function getRandomRoomId() {
        $room = \App\Room::inRandomOrder()->first();
        return $room->id;
    }
    

    试试这个。这个对我有用。希望它对你有用。

    【讨论】:

    • 所有 150 个生成的用户都有相同的 room_id。
    • @udders 您的数据库中有超过 1 个房间吗?
    • 第一个运行的播种机生成 30 个房间
    • @UtkarshRaval 不会真正帮助我,因为在 ID 生成之前我不会知道它们。
    【解决方案3】:

    试试这个。另外,请确保房间表中有多个自动递增的房间条目。

    $factory->define(App\User::class, function ($faker) use ($factory)  {
        return [
            'host' => false,
            'room_id' => $factory->create(App\Room::class)->id
        ];
    });
    

    【讨论】:

      【解决方案4】:

      我在播种时遇到了同样的问题。问题是,您通过传递“值”数组来覆盖工厂的默认模型属性。您正在将 App\Room::inRandomOrder()->first()->id 的值传递给 create 方法。所以你会让所有用户都拥有相同的room_id

      为了解决这个问题,在 laravel 8 中,您可以将 'room_id' => Room::inRandomOrder()->first()->id 移动到您的 UsersFactory 定义中:

      class UsersFactory {
      ...
      
          public function definition()
          {
              return [
                  'room_id' => Room::inRandomOrder()->first()->id
              ];
          }
      ...
      }
      

      并像这样创建用户,

      App\User::factory()->count(150)->create([
          'host' => false
      ]);
      

      在旧版本的 laravel 中,定义你的工厂如下:

      $factory->define(App\User::class, function ($faker) use ($factory)  {
          return [
              'room_id' => Room::inRandomOrder()->first()->id
          ];
      });
      

      并像这样创建用户,

      factory(App\User::class, 150)->create([
              'host' => false,
          ]);
      
      

      【讨论】:

        猜你喜欢
        • 2014-03-01
        • 2021-04-15
        • 2018-03-11
        • 1970-01-01
        • 2012-10-03
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多