在 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)可能会非常困惑,虽然这是一个选项。
个人比较喜欢用
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,
模型名称可以根据需要更改。
目前,在我的 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)可能会非常困惑,虽然这是一个选项。
个人比较喜欢用
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,
模型名称可以根据需要更改。