我有两个班级,Product
和ProductFormat
。正确定义了关系,我的产品hasMany
ProductFormat。
public function formats()
{
return $this->hasMany(ProductFormat::class);
}
当我尝试加载与特定列的关系时,如文档(https://laravel.com/docs/5.6/eloquent-relationships#eager-loading)中所示,它没有按预期工作。
例如,当我执行以下操作时:
Product::with('formats:id,upc')->get();
我得到了我的产品,到处都是空格式。
{
id: 1,
formats: [ ]
}
但是,如果我执行以下操作:
Product::with('formats')->get();
我得到了预期的格式,但它有太多不需要的列。
{
id: 1,
formats: [
{
id: 1,
upc: "101862422191",
weight: 8.46,
weight_unit: "kg"
}
]
}
答案 0 :(得分:14)
您总是需要选择涉及关系的外键/主键。在急切的负载中获取product_id也会有效
Product::with('formats:id,upc,product_id')->get();
答案 1 :(得分:0)
我遇到了同样的问题,但我通过以下方式解决了这个问题:
// Change this in model
public function formats()
{
return $this->hasMany(ProductFormat::class)->select(['id', 'upc']);
}
// No need to join here.
$data = Product::all();
foreach ($data as $key => $value) {
echo "<pre>";
print_r($value->formats);
}
通过这种方式,您将获得所需的格式。
答案 2 :(得分:0)
我遇到了这个问题,所以我不得不以这种方式编写查询。除非您从关系
中获得一个null
值,否则您将需要检索外键的ID。
Transaction::with([
'client' => function($query){
$query->select('id', 'first_name');
}
])->get();
答案 3 :(得分:0)
要在 Eager 加载中获取特定列,有两种方法:
方法一:
在您的 dsl.withRecursive( name( "nodes" )
.fields( "node_key",
"parent_ids",
"parent_path" ).as(
select(
NODE.NODE_KEY,
array( NODE.NODE_KEY).as( "parent_ids" ),
array( NODE.NAME).as( "parent_path" )
)
.from( NODE)
.where( NODE.PARENT_NODE_KEY.isNull() )
.unionAll(
select( NODE.NODE_KEY,
field( "parent_ids" ))
) )
) );
模型中,设置 ProductFormat
方法二:
使用接受 protected $visible = ['col_1,'col_2'];
作为参数的 closure
。
Builder $query