Laravel collection pluck 方法未按预期工作

Laravel collection pluck method not working as expected

我已经进入了 Laravel 的奇妙世界,目前我正在研究用假数据为数据库播种以进行测试。

我有几个 table 想一起工作; 项目故事

故事 table 有专栏; idnameproject_id(这是项目 table).

我的项目 table 已经填充了 10 个项目的列表。现在我需要用相关的随机项目填充 100 个故事。我有下面的方法。

public function run()
{
    DB::table('stories')->delete();
    DB::statement('ALTER TABLE stories AUTO_INCREMENT = 1');

    $faker = Faker::create();

    foreach(range(1, 100) as $index)
    {
        Story::create([
            'reference' => $faker->numberBetween(1, 9999),
            'name' => $faker->sentence(6),
            'project_id' => Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')
        ]);
    }
}

我不知道这是否是满足我需要的最佳方式。但是,在执行此代码时,每个故事的 project_id 都设置为 1;第一个项目的id。

当我在 tinker 中执行以下命令时...它总是 returns 1 作为 id。

Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')

但是当我在 tinker 中执行下一个命令时...

Project::orderBy(\DB::raw('RAND()'))->get()->first()

它 returns 每次都是一个随机项目。这很奇怪。因为如果直到 ->pluck() 的一切都在工作,那么 pluck() 应该获取收集的项目 id... 对吗?这就是上面的命令 returns.

<App\Project #000000000c385908000000000de30942> {
   id: 6,
   name: "New Bernadetteton",
   cover_photo_url: "/uploads/covers/horizon-grass.png",
   created_at: "2015-07-08 16:32:15",
   updated_at: "2015-07-08 16:32:15" }

请参阅下面我的终端屏幕截图 window 来说明我的意思。

这是正在发生的事情:

  1. 有了->first()你就得到了实际的项目模型

  2. 然后你调用pluck('id')就可以了。但是 Model class 没有那个方法。

  3. 因此,与 Model 不知道的每个方法一样,它将调用重定向到模型的新查询构建器实例。

  4. 最后,那个电话在这里结束:

Illuminate\Database\Eloquent\Builder@value

public function value($column)
{
    $result = $this->first(array($column));

    if ($result) return $result->{$column};
}

如您所见,该方法运行一个新查询,使用 first() 然后 returns 所需的行。


现在你真正想要的是:

1。完全不要使用 pluck

其实没必要用那个方法,直接访问模型就可以了 属性:

'project_id' => Project::orderBy(\DB::raw('RAND()'))->first()->id

2。使用pluck,但要正确

'project_id' => Project::orderBy(\DB::raw('RAND()'))->pluck('id')

顺便说一下,主要方法被称为 value()pluck() 只是一个别名。我建议在新代码中使用 value()。别名可能有一天会被删除。 (显然只是在新版本中,升级指南中有注释,所以不要惊慌;))