如何从急切加载中指定我们想要的列

Posted

技术标签:

【中文标题】如何从急切加载中指定我们想要的列【英文标题】:How to specify columns we want from eager load 【发布时间】:2021-02-25 14:42:31 【问题描述】:

我正在使用 Beyondcode/laravel-cmets (https://github.com/beyondcode/laravel-comments) 并尝试指定我想从评论员那里获得的列。这是代码:

$comment = $post->comments()->with('commentator', function ($query) 
        $query->select('commentator.name', 'commentator.email');
        //or $query->select('users.name', 'users.email');
)->latest();

我收到错误提示

Undefined table: 7 ERROR:  missing FROM-clause entry for table "commentator" // or users

我该如何解决?谢谢

【问题讨论】:

【参考方案1】:

As in the documentation,只需像这样执行您的急切加载来指定列,不需要函数:

$comment = $post
    ->comments()
    ->with('commentator:id,name,email')
    ->latest();

如果您确实需要使用回调来改变预加载,则必须使用数组,如 in the documentation 所示:

$comment = $post
    ->comments()
    ->with([
        'commentator' => fn ($q) => $q->select('id', 'name', 'email')
    ])
    ->latest();

【讨论】:

请注意,在急切加载特定列时,您应该始终运行id('commentator:id,name,email') 这些代码返回 502 bad gateway,没有来自服务器的任何日志。也许我错过了什么? @Cutis 这似乎不太可能; 502 通常是 php-FPM 的问题。 我在想也许我的包裹有问题 github.com/beyondcode/laravel-comments 我会将您的答案标记为已接受,因为它有助于我自己的 laravel 关系。非常感谢@miken32【参考方案2】:
$comment = $post->comments()->with('commentator:primary_key,your_column_name')->latest();

使用此功能时,您应该始终在要检索的列列表中包含 id 列和任何相关的外键列。

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。

以上是关于如何从急切加载中指定我们想要的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中指定双精度?

如何在闪亮的可编辑数据表中指定文件名并限制列编辑

如何在 Webpack 插件中指定多个加载器?

如何在 Makefile.am 中指定我想要 C++0x?

如何在 Xcode 中指定表单完成后要加载的视图?

错误:INSERT语句中的列多于VALUES子句中指定的值