今天我想做一些干净的代码,所以刚开始为关系选择列。使用此代码:
\App\Genre::with([
'family'
])->where([
'slug' => $slug,
'is_active' => true
])->first();
一切都运转良好。但是,当我开始为"和"选择列时方法:
\App\Genre::with([
'family' => function ($query) {
$query->select('name_pl', 'name_lat');
}])->where([
'slug' => $slug,
'is_active' => true
])->first();
我得到的那个家族是null(但它应该是一个带有列的对象:name_pl,name_lat)。我做错了什么?
Genre类中的族方法如下所示:
public function family () {
return $this->belongsTo(Family::class);
}
我正在使用Laravel 5.4
答案 0 :(得分:1)
你为什么不试试:
\App\Genre::with('family:name_pl,name_lat')->where([
'slug' => $slug,
'is_active' => true
])->first();
答案 1 :(得分:1)
非常确定您需要将相关列添加到所选列的列表中,否则Laravel无法将数据与急切加载相匹配。
假设Genre
有family_id
且Family
指定了id
主键列,则需要:
$query->select('id', 'name_pl', 'name_lat'); // See the id added here?
应该做的伎俩。
为清楚起见,我提到的匹配就是这个:
select * from genre
select * from family where id in (1, 2, 3, 4, 5, ...)
- 以逗号分隔的ID列表包含在第一个查询中检索到的唯一family_id
值。