【问题标题】:In Laravel, how do I retrieve a random user_id from the Users table for Model Factory seeding data generation?在 Laravel 中,如何从用户表中检索随机 user_id 以生成模型工厂种子数据?
【发布时间】:2017-10-21 11:57:51
【问题描述】:

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

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

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

【问题讨论】:

  • 如果我理解正确,那么您一定已经产生了一些用户。考虑到您有 1000 个用户,您可以使用:$faker->numberBetween(1, 1000),random_int(1, 1000)
  • 我明白了,是的,我在考虑我的选择是什么。 :)

标签: php database laravel model seed


【解决方案1】:

试试下面的。

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

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

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

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

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

【讨论】:

  • 我输入了'use App\User;'在文件 ModelFactory.php 的顶部,但是当 php artisan db:seed 运行时,'user_id' 显示为 none,我做错了什么?
  • 您要连接的数据库中是否已有任何用户数据?如果没有,你可以使用 - factory(App\User::class, 5)->create();这样就会有一些用户数据。确保在尝试播种回复数据之前播种用户数据
  • 是的,我预先创建了 51-131 的用户 ID。所以我真的希望我也能够在该数字之间随机生成一个 user_id。现在我正在尝试类似 'user_id' => factory('App\User')->all()->random()->user_id 之类的东西,但没有太大成功,对不起,我有点菜鸟。 :)
  • 数据库中用户表中用户 id 的列名是什么?
  • 安妮塔,你是个天才,我是个白痴,是的,这就是问题所在,列名是 'id' 而不是 'user_id',现在你的代码可以完美运行了。非常感谢安妮塔!干杯! :)
【解决方案2】:

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

User::inRandomOrder()->first()

或者获取 3 个项目的集合:

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

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

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

另见:Laravel - Eloquent or Fluent random row

【讨论】:

    【解决方案3】:

    它不像'user_id'那样工作:

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

    但这就是它的工作原理:

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

    【讨论】:

    • 那些有线的**叫?‍♂️是什么?
    • 这个“**”不在这里
    【解决方案4】:

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

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

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

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

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

    【讨论】:

      【解决方案5】:

      我个人喜欢用。

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

      更改型号名称您想要的型号

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 2021-11-25
        • 2017-08-29
        • 2015-11-17
        • 2021-05-15
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2020-02-16
        相关资源
        最近更新 更多