Laravel Eloquent ->with() 和 ->select() 相互冲突

4

考虑以下代码:

Articles
::select('article_id', 'article_text')  //This one does not work as expected
->with([
    'user' => function($q){
        $q->select('user_id', 'user_name'); // This one works fine
    }
])
->get();

在Eloquent中构建查询时,我们可以使用 ->with() 来检索相关模型。我们还可以附加 ->select(),以确定要从关联模型选择哪些列。但是,看起来我们失去了指定应从正在查询的基本模型中选择哪些列的可能性。
在这个例子中,由于第一个 ::select,最终返回的结果不包括用户(user),因为它没有包含在 ::select 列表中。如果我在那里包含它,那么它会抛出“列未找到”的错误。Eloquent 不够聪明,无法理解我意味着关系而不是列。
是否有可能指定应从用户(user)以及文章(article)返回哪些列?

你的假设有点错误。第一个select中没有user并不重要。这是两个独立的查询,所以你选择什么并不重要,只要包括所有涉及到的键(PK,FK)- 就像@lagbox已经说过的那样。 - Jarek Tkaczyk
1个回答

4
你可以使用贪婪加载约束条件选择所需列,但仍需至少选择用于关系的列。
随机示例:
User::with(['tickets' => function ($q) {
    $q->select('user_id');
}])->select('id')->get();

这些是必须的最小字段,以便返回关联结果并附加到正确的模型上。

您需要从tickets中选择至少user_id和从users中选择id。这些列用于此关系。tickets.user_id -> users.id

查询日志:

'select `id` from `users`'

'select `user_id` from `tickets` where `tickets`.`user_id` in ( .... )'

拥有这些字段可以让你得到所需的关系返回结果,现在你可以向这些选择器中添加其他字段。

希望这能有所帮助。


你有没有想过为什么这段代码会导致 Nginx 502 错误:$orders = OrderHeader::where('created_by', $this->user->id) ->with(['status' => function ($q) { $q->select('id','name'); }]) ->select('id') ->get(); 如果我移除 'select' 或 'with',它就能正常工作。 - kbeat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接