Laravel:限制列以热切加载的关系检索,但有约束条件

时间:2018-07-05 00:31:30

标签: laravel eloquent

当我急切地加载直接的口才关系时,我可以使用以下语法来限制检索到的列:

MyModel::with(myRelation:id,col_2,col_3);

当我想约束关系成员时,请执行以下操作:

MyModel::with(['myRelation' => function ($query) {
    $query->where([
        ['field_1', 'a_value'],
        ['field_2', 'b_value']
    ]);
}]);

但这会加载相关模型的所有列。我尝试用完整的语法myRelation替换键myRelation:id,col_2,col_3,但是会引发错误,提示找不到关联名称。

我还尝试将以下方法添加到$query

->select('id', 'col_2', 'col_3')

->addSelect('id', 'col_2', 'col_3')

->get('id', 'col_2', 'col_3')

这些都不成功。

2 个答案:

答案 0 :(得分:0)

一种选择可能是使原始模型MyRelation所指向的所有列(id,col_2,col_3除外)都隐藏。

protected $hidden = ['col_4', 'col_5',...];

您还可以在模型MyModel中更改关系定义:

public function myRelation()
{
    return $this->belongsTo('MyRelation')->select(array('id', 'col_2', 'col_3'));
}

但是,一般来说,这应该可行:

MyModel::with(array('myRelation'=>function($query){
        $query->select('id','col_2', 'col_3)
              ->where([
                       ['field_1', 'a_value'],
                       ['field_2', 'b_value']
                ]);
    }))->get();

请记住,您必须在上面的选择列表中包括加入密钥(例如id)。

答案 1 :(得分:0)

好,因此要使其正常工作,我必须:

  • 在选择列表(谢谢,@ ankitPatel)中包括foreign_key,并且
  • 将参数作为数组传递给select语句,如下所示:

    -> select([['id','foreign_key','col3','col4'])