我有两个相关的模型:
class Attribute extends Eloquent
{
public function categories()
{
return $this->hasMany('Category');
}
}
class Category extends Eloquent
{
public function attributes()
{
return $this->belongsTo('Attribute');
}
}
我想将所有属性及其类别作为JSON对象返回,但我只想在两个模型中选择某些字段(即,不返回JSON中类似“created_at”的字段)。
我试过这个:
$attributes = Attribute::select('id', 'name')
->with(['categories' => function ($query) {
$query->select('categories.id', 'categories.name', 'categories.attribute_id');
}]);
Response::JSON($attributes->get());
但是,尽管对相关模型进行了选择查询,仍会返回未请求的字段:
attributes: [{
id: 3,
name: "Organisation",
categories: [{
id: 3,
name: "Asia HQ",
attribute_id: 3,
created_at: "2013-11-30 00:00:00",
updated_at: "2013-11-30 00:00:00"
}]
}]
在快速加载时,如何仅选择相关模型中的某些列?
一个雄辩的方法会像这样怎么样?
public function dynamicAttributes($array_columns) {
return $this->belongs_to('User')->select((array) $array_comuns);
}
其中$array_columns
可以是表示所需列的字符串或字符串数组?
使用Select()laravel方法:
$attributes = Attribute::select('id', 'name')->with(['categories' =>function($query){
$query->select(['categories.id', 'categories.name','categories.attribute_id'])->get();
}]);
Response::JSON($attributes->get());
要使选择方法在急切加载中工作,您需要在选定的列列表中包含foreign_key。
参考:http://laravel-tricks.com/tricks/column-selection-in-eager-loading
如果您想始终从类别关系中返回这些特定字段,在关系中定义选择将起作用,但是如果您想在一个特定查询中动态执行此操作,请要求雄辩只返回这些字段。
$attributes = Attribute::with(['categories' => function ($query) {
$query->select('id', 'name', 'attribute_id');
}])->get('id', 'name');
... 或者你可以用Fluent
DB::table('attributes')
->join('categories', 'attributes.id', '=', 'categories.attribute_id')
->select('attributes.id', 'attributes.name', 'categories.id', 'categories.name', 'categories.attribute_id')
->get();