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

标签 laravel laravel-4 eloquent

考虑这个代码:

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 中列表。如果我在那里包含它,那么它会抛出一个关于 column not found 的错误. Eloquent 不够聪明,无法理解我的意思是关系,而不是专栏。

是否可以指定应从 user 返回哪些列?以及来自 article ?

最佳答案

您可以使用预先加载约束选择所需的列,但您仍然至少需要选择用于关系的列。

随机示例:

User::with(['tickets' => function ($q) {
    $q->select('user_id');
}])->select('id')->get();

这些是返回关系结果并将它们附加到正确模型所需的最少字段。

您需要至少选择 user_id来自 ticketsid来自 users .这些是用于此关系的列。 tickets.user_id -> users.id
查询日志:
'select `id` from `users`'

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

拥有这些字段可为您提供关系返回结果所需的内容,现在您可以向这些选择添加其他字段。

我希望这有帮助。

关于Laravel Eloquent ->with() 和 ->select() 相互冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27702492/

相关文章:

php - 我长期运行的 laravel 4 命令一直被杀死

php laravel 如何插入外键

php - 使用 IBM Bluemix 进行 Laravel 数据库迁移

php - 从预先加载的 laravel 集合中加载特定的列

php - 如何在 laravel 5.2 迁移中删除包含外键的组合键

javascript - AJAX 调用的结果,jQuery .append() 不适用于 Laravel 5.4

javascript - 在自定义验证中使用 Angular JS + Laravel 检查当前密码

sql - Laravel Eloquent检索第一个元素并保持查询结果完整吗?

laravel - Eloquent:hasNot 带参数

JavaScript 变量在 Laravel 中不起作用