在 Laravel 中,如何从用户 table 中检索随机 user_id 以生成模型工厂种子数据?

In Laravel, how do I retrieve a random user_id from the Users table for Model Factory seeding data generation?

目前,在我的 ModelFactory.php 中,我有:

$factory->define(App\Reply::class, function (Faker\Generator $faker) {
  return [
    'thread_id' => 1,
    'user_id' => 1,
    'body' => $faker->paragraph
  ];
});

我想从用户 table 中已存储的其中一个用户 ID 生成一个随机 user_id。我很困惑,因为我不知道如何正确显示数据输出到代码,我想知道如何才能让 Laravel 选择一个随机用户 ID 并插入到数据库中。谢谢! :)

试试下面的方法。

use App\User; // Assuming this is your User Model class with namespace.

$factory->define(App\Reply::class, function (Faker\Generator $faker) {
  return [
    'thread_id' => 1,
    'user_id' => User::all()->random()->id,
    'body' => $faker->paragraph
  ];
});

请记住,这会从您的 table 获取所有用户数据,然后随机选择一个 ID。所以如果你的table数据量很大,不推荐使用。相反,在您的测试用例中,您可以创建一个新用户(通过其自己的工厂)并将 id 分配给从上述工厂生成的回复对象。

或者,您可以在上述工厂定义中查询特定用户。

'user_id' => User::where('username', 'like', 'test@user.com')->get()->random()->id

如果您在数据库中设置了测试用户,这将避免提取所有用户数据。

不是这样的'user_id':

User::all()->random()->user_id

但这就是它的工作原理:

User::all()->random()->id

任何扩展 Illuminate\Database\Eloquent\Model 的 class 都可以这样做:

User::inRandomOrder()->first()

或获取 Collection 3 件物品:

User::inRandomOrder()->limit(3)->get()

这可能比使用 User::all()->first() 更有效,后者应该首先查询所有用户。

您的IDE(如 PhpStorm)可能会非常困惑,虽然这是一个选项。

另见:Laravel - Eloquent or Fluent random row

个人比较喜欢用

App\User::pluck('id')->random()

更改您想要的型号名称

效率可能不高,但你可以使用它:

User::all('id')->random();

rand(1,User::count());

User::inRandomOrder()->limit(1)->get();

第一个会比 User::all()->random()->id; 更快,因为默认情况下所有函数都将“*”作为列名参数。因此,它将获取所有行的所有列。

如果有人想要独特的 User_id 你可以试试这个。

'user_id' => User::all()->unique()->random()->id,

或者是

'user_id' => User::all()->random()->id,

模型名称可以根据需要更改。