我已经进入了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" }
请参阅下面的终端窗口截图,说明我的意思。
答案 0 :(得分:4)
以下是发生的事情:
使用flush
,您可以获得实际的项目模型
然后你打电话给->first()
。但pluck('id')
类没有该方法。
因此,与Model
不知道的每个方法一样,它将调用重定向到模型的新查询构建器实例。
最后,该电话会在此结束:
Model
Illuminate\Database\Eloquent\Builder@value
如您所见,该方法使用public function value($column)
{
$result = $this->first(array($column));
if ($result) return $result->{$column};
}
运行新查询,然后返回所需的行。
现在你真正想要的是:
first()
实际上不需要使用该方法,您只需访问模型属性:
pluck
'project_id' => Project::orderBy(\DB::raw('RAND()'))->first()->id
,但执行正确pluck
顺便说一句,主要方法叫做'project_id' => Project::orderBy(\DB::raw('RAND()'))->pluck('id')
。 value()
只是一个别名。我建议在新代码中使用pluck()
。别名可能会在某一天被删除。 (显然只是在新版本中并且在升级指南中有注释,所以不要惊慌;))