Laravel采集方法不能按预期工作

时间:2015-07-08 20:09:23

标签: laravel artisan faker laravel-collection

我已经进入了Laravel梦幻般的世界,我目前正在考虑为假数据播种数据库进行测试。

我有几张我想要合作的牌桌; 项目故事

故事表有列; ID 名称 project_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;第一个项目的身份。

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

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

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

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

每次都会返回一个随机项目。这很奇怪。因为如果一切都在 - > gt; 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" }

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

enter image description here

1 个答案:

答案 0 :(得分:4)

以下是发生的事情:

  1. 使用flush,您可以获得实际的项目模型

  2. 然后你打电话给->first()。但pluck('id')类没有该方法。

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

  4. 最后,该电话会在此结束:

  5. Model

    Illuminate\Database\Eloquent\Builder@value

    如您所见,该方法使用public function value($column) { $result = $this->first(array($column)); if ($result) return $result->{$column}; } 运行新查询,然后返回所需的行。

    现在你真正想要的是:

    1。不要使用first()

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

    pluck

    2。使用'project_id' => Project::orderBy(\DB::raw('RAND()'))->first()->id ,但执行正确

    pluck

    顺便说一句,主要方法叫做'project_id' => Project::orderBy(\DB::raw('RAND()'))->pluck('id') value()只是一个别名。我建议在新代码中使用pluck()。别名可能会在某一天被删除。 (显然只是在新版本中并且在升级指南中有注释,所以不要惊慌;))