在Laravel中,如何从Users表中为模型工厂种子数据生成检索随机user_id?

Sim*_*Suh 7 php database model seed laravel

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

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

我想从已经存储在用户表中的一个用户ID生成一个随机user_id.我很难过,因为我不知道如何正确显示数据输出到代码,我想知道如何让Laravel选择随机用户ID并插入数据库.谢谢!:)

小智 24

试试下面的内容.

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()->user_id,
    'body' => $faker->paragraph
  ];
});
Run Code Online (Sandbox Code Playgroud)

请记住,这会从您的表中获取所有用户数据,然后随机选择一个id.因此,如果您的表有大量数据,则不建议使用.相反,在您的测试用例中,您可以创建一个新用户(通过自己的工厂)并将id分配给从上述工厂生成的Reply对象.

或者,您可以在上面的工厂定义中查询特定用户.

'user_id' => User::where('username', 'like', 'test@user.com')->get()->random()->user_id
Run Code Online (Sandbox Code Playgroud)

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


Hen*_*ley 9

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

User::inRandomOrder()->first()
Run Code Online (Sandbox Code Playgroud)

或获取 3 个项目的集合:

User::inRandomOrder()->limit(3)->get()
Run Code Online (Sandbox Code Playgroud)

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

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

另请参阅:Laravel - Eloquent 或 Fluent 随机行

  • 这比公认的答案要好得多。这不会将整个表拉入内存只是为了获得一个随机记录。 (2认同)

Nel*_*iar 5

它不像“user_id”那样工作:

User::all()->random()->user_id
Run Code Online (Sandbox Code Playgroud)

但这就是它的工作原理:

User::all()->random()->id
Run Code Online (Sandbox Code Playgroud)