Laravel 在急切加载时使用 Eloquent 选择特定列

Posted

技术标签:

【中文标题】Laravel 在急切加载时使用 Eloquent 选择特定列【英文标题】:Laravel select specific columns with Eloquent while eager loading 【发布时间】:2021-01-21 16:43:19 【问题描述】:

我正在使用 Laravel 8。我有 2 个表并尝试使用 Eloquent 从两个表中选择特定列:

$ids = [1, 8, 14];
$food = Food::with(
            ['animals' => function ($query)
            
                $query->select('id', 'name');
                $query->where('status', 1);
            ])
            ->select('id', 'type')
            ->whereIn('id', $ids)
            ->where('status', 1)
            ->get();

但是,如果我向 Food 模型添加 select 方法,Laravel 会为 animals 表返回 null

如果我没有在 Food 模型上指定选择,Laravel 会从 Food 模型和 idname 中返回 animals 表中的所有内容。

如何在使用 Eager Loading 时同时从 FoodAnimal 表中进行选择?

【问题讨论】:

您必须确保还选择了关系所需的任何外键 可以分享animals关系函数吗? @lagbox 这就是问题所在,非常感谢您指出。我从选择查询中遗漏了一个外键!如果您创建一个答案,我会批准它! 在这种情况下哪个表有外键,顺便说一句? @lagbox animals 表。我将它添加到food 表的选择中,它立即生效。 【参考方案1】:

您必须确保从关系的任一方选择该 ID 的关系所需的任何外键。这允许 Eloquent 将父母与他们的孩子进行匹配。

【讨论】:

【参考方案2】:

试试这个,在select中指定表。

Food::with(['animals' => function ($query) 
            $query->where('status', 1);
        ])
        ->select('food.id', 'animals.type', 'food.type')
        ->whereIn('id', $ids)
        ->where('status', 1)
        ->get();

【讨论】:

以上是关于Laravel 在急切加载时使用 Eloquent 选择特定列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 中的急切加载

laravel eloquent - 在嵌套急切加载的关系上不使用

Laravel 混合获取 Eloquent 急切加载嵌套多个模型

Laravel 动态关系 - 在急切加载时访问模型属性

从 5.1 迁移到 5.3 时急切加载关系的 Laravel 错误

急切加载时为 Eloquent 关系别名