Laravel 5.6 Eager加载特定列不返回任何内容

时间:2018-04-26 14:23:08

标签: php laravel laravel-5

我有两个班级,ProductProductFormat。正确定义了关系,我的产品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"
        }
   ]
}

4 个答案:

答案 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