0

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

我有几张桌子要使用;项目故事

故事表有列;idnameproject_id(这是项目表的 fk)。

我的项目表已经填充了 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。

当我在修补程序中执行以下命令时......它总是返回 1 作为 id。

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

但是当我在修补程序中执行下一个命令时......

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

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

<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" }

请参阅下面的终端窗口屏幕截图以说明我的意思。

在此处输入图像描述

4

1 回答 1

4

这是正在发生的事情:

  1. ->first()您一起获得实际的项目模型

  2. 然后你调用pluck('id')它。但是这个Model类没有那个方法。

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

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

Illuminate\Database\Eloquent\Builder@value

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

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

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


现在你真正想要的是:

pluck1.完全不要使用

实际上不需要使用该方法,您只需访问模型属性即可:

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

2. 使用pluck,但做对

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

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

于 2015-07-08T20:30:33.870 回答