$query->with() 正在工作,但 $query->load() 在 Laravel 中不起作用

Posted

技术标签:

【中文标题】$query->with() 正在工作,但 $query->load() 在 Laravel 中不起作用【英文标题】:$query->with() is working but $query->load() not working in Laravel 【发布时间】:2021-01-29 10:30:43 【问题描述】:

我有三个模型。

    部分 主题 章节

章节有很多主题,主题有很多章节。 我想加载一个包含所有主题的部分以及包含所有章节的主题。 这是我正在尝试的代码:

$section = Section::find(1)->load(['subjects' => function ($query) 
                    $query->load('chapters');
                ]);

这不起作用。 $query->load('chapters') 这部分给了我错误。但如果我尝试这段代码:

$section = Section::find(1)->load(['subjects' => function ($query) 
                $query->with('chapters');
            ]);

这是有效的。我对$query->with() 有一些问题,所以我想改用$query->load()。我应该怎么做才能使用load() 而不是with()>

【问题讨论】:

【参考方案1】:

Eloquent 查询构建器没有名为 load() 的函数。但 Eloquent 模型可以。

$section = Section::find(1)
               ->load(['subjects' => function ($query)  // in here you are calling load on a model (Section).
                    $query->load('chapters'); // in here you are calling load on a query builder instance.
               ]);
当你想在获取模型后加载一些关系时,使用load()函数 如果您想在获取模型的同时加载一些关系,请使用with() 函数

在您的情况下,您已经获取了主题。所以你可以使用load('subject')。但是当你加载主题时(你还没有获取主题),所以你应该打电话给with('chapters')

编辑 您的第二种方法的简短版本

$section = Section::find(1)->load(['subjects.chapters');

如果没有特殊要求单独获取部分,更好的方法是在获取部分的同时加载主题和章节。

$section = Section::with('subjects.chapters')->find(1)

【讨论】:

【参考方案2】:

为什么不使用:

$section = Section::query()->with('subjects.chapters')->find(1)

这将预加载带有章节的主题并让您快速获得结果。

【讨论】:

以上是关于$query->with() 正在工作,但 $query->load() 在 Laravel 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Page_navi 插件创建但它不工作

mysql table is full error running query with pymysql

在 Laravel Eloquent 中使用“with()”函数连接列

laravel api处理程序如何通过子列进行排序

replace temp with query

laravel with closure