在 Laravel Eloquent 中使用 with() 返回对象
Posted
技术标签:
【中文标题】在 Laravel Eloquent 中使用 with() 返回对象【英文标题】:Return object using with() in Laravel Eloquent 【发布时间】:2018-07-02 18:33:53 【问题描述】:目前我得到这样的数据:
->with(['posts' => function ($query)
$query->active()->available()->limit(1)->with('user');
])
并将用户数据作为预期的对象数组返回。因为我使用了一个限制并且只需要一个结果,所以我想将它作为一个常规对象返回,而不是:
"data": value,
"posts": [
"data": value,
"user":
"data": value
]
我想把它返回为:
"data": value,
"post":
"data": value,
"user":
"data": value
最好的方法是什么?
【问题讨论】:
这里远射,但尝试用first()
替换limit(1)
@FelippeDuarte 根本不是一个坏主意,甚至在其他形式上也被建议,但这样做似乎不会触发 ->with('user')
部分,并且仍将 posts
作为数组返回:P
【参考方案1】:
在您的模型上创建一个 hasOne
关联,定义您想要的范围。
public function activePost()
return $this->hasOne(Post::class)->active()->available();
]
然后调用 with('activePost.user')
以加载该单个、活动且可用的帖子及其关联用户。
【讨论】:
似乎是个主意!即使已经定义了 hasMany 关系,这是否可行?我刚刚遇到了 first() 的错误,实际上只返回一个结果而不是每个父对象的一个结果......有什么想法吗? 是的 - 他们可以并肩生活,他们将完全独立于彼此。您不能像上面有人建议的那样在with()
范围查询中使用first()
,因为它期望返回查询,而不是模型。
我还需要在新协会上写first()
吗?
不——因为它是hasOne
Laravel 知道你只想要一个模型。让代码在您的项目中运行,看看它对您有何帮助。【参考方案2】:
只要你的关系是hasMany
、hasManyThrough
、belongsToMany
、morphMany
、morphedByMany
关系(我认为这就是全部),从主要使用开始,急切加载将始终返回一个数组with
方法中的一个用于向关系添加子句。
引自 laracasts 论坛上的最佳答案:https://www.laracasts.com/discuss/channels/eloquent/first-and-take-do-not-work-correctly-in-eager-load-laravel?page=0)
@Dwight 的回答是正确的方法。
【讨论】:
...这是问题的答案吗?以上是关于在 Laravel Eloquent 中使用 with() 返回对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Eloquent 查询/Laravel 5.2 中使用变量
Laravel:在 API 测试中使用 Eloquent 模型
如何在 Laravel 5.8 中使用 Eloquent 进行查询?
在 Laravel 中使用 Eloquent 进行更高级的数据库查询