Laravel collection pluck 方法未按预期工作
Laravel collection pluck method not working as expected
我已经进入了 Laravel 的奇妙世界,目前我正在研究用假数据为数据库播种以进行测试。
我有几个 table 想一起工作; 项目和故事。
故事 table 有专栏; id、name 和 project_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 来说明我的意思。
这是正在发生的事情:
有了->first()
你就得到了实际的项目模型
然后你调用pluck('id')
就可以了。但是 Model
class 没有那个方法。
因此,与 Model
不知道的每个方法一样,它将调用重定向到模型的新查询构建器实例。
最后,那个电话在这里结束:
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()
。别名可能有一天会被删除。 (显然只是在新版本中,升级指南中有注释,所以不要惊慌;))
我已经进入了 Laravel 的奇妙世界,目前我正在研究用假数据为数据库播种以进行测试。
我有几个 table 想一起工作; 项目和故事。
故事 table 有专栏; id、name 和 project_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 来说明我的意思。
这是正在发生的事情:
有了
->first()
你就得到了实际的项目模型然后你调用
pluck('id')
就可以了。但是Model
class 没有那个方法。因此,与
Model
不知道的每个方法一样,它将调用重定向到模型的新查询构建器实例。最后,那个电话在这里结束:
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()
。别名可能有一天会被删除。 (显然只是在新版本中,升级指南中有注释,所以不要惊慌;))