我有一个 hasMany 关系函数,如下所示:
public function articles()
{
return $this->hasMany('App\Article');
}
并像这样使用它:
$data = \App\User::with('articles')->get();
我没有遇到任何问题,因为它返回了预期的数据。像这样:
{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
{
"id": 1,
"title": "Article 1",
"status": "published",
"published_at": "2015-04-30"
},
{
"id": 2,
"title": "Article 2",
"status": "draft",
"published_at": null
}
]
}
我想要实现的目标,但我仍然无法获取关系字段的一部分来获取此信息:
{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
{
"id": 1,
"title": "Article 1"
},
{
"id": 2,
"title": "Article 2"
}
]
}
我的目的是找到一种方法来指定模型函数中的字段子集,而不是迭代返回的集合并取消设置不需要的字段。
这可能吗?
答案 0 :(得分:16)
你有几个选择:
使用时修改关系查询。 with()
方法可以接受键/值对的数组,其中键是关系的名称,值是修改关系查询的Closure。
$data = \App\User::with(['articles' => function($query) {
$query->select(['id', 'title', 'user_id']);
}])->get();
创建一个包含所需字段的新关系。
public function articleTitles() {
return $this->hasMany('App\Article')->select(['id', 'title', 'user_id']);
}
$data = \App\User::with('articleTitles')->get();
如果您只关心数组/ json输出,则可以修改App \ Article模型,以便在转换为数组时仅显示id和title。
class Article extends Model {
protected $visible = ['id', 'title'];
}
您选择的内容取决于您的需求。
注意:对于上面的选项1和2,必须选择外键(user_id
),以便Laravel知道在构建关系时如何将模型链接在一起。
答案 1 :(得分:0)
$data = \App\User::with('articles:id,title,user_id')->get();
// user_id在hasmay关系中很重要