laravel - 受约束的急切负载不执行附加查询
问题描述
我想加载一个物种的集合,按其属的“名称”列排序,然后按他们自己的“名称”列排序。
$webstore_species = Species::where('in_webstore', true)
->orderBy('name', 'asc')
->with(['genus' => function($query) {
$query->orderBy('name', 'asc');
}])->get();
但是 $query 永远不会执行,结果仅按 Species 名称排序。如果我将它从 orderBy 更改为另一个用于测试的 where 函数,它也不会被执行。
但据我所知,这种'genus'
关系是正确的并且工作正常,我似乎正在关注有关 Eager Loading 的文档。
class Species extends Model
{
/** Return the many-to-one relationship with the Genus model.
*
* @return App\Models\Genus
*/
public function genus()
{
return $this->belongsTo(Genus::class);
}
}
当我在 Tinker 中执行以下操作时,会显示这种关系有效:
>>> $species = Species::find(46)
=> App\Models\Species {#3201
id: 46,
name: "vagus",
genus_id: 2,
in_webstore: 1,
slug: "camponotus-vagus",
created_at: "2018-09-30 07:10:26",
updated_at: "2019-08-18 21:45:00",
}
>>> $species->genus
=> App\Models\Genus {#3172rBy('name', 'asc');
id: 2,
name: "Camponotus",
}
顺便说一句,我不知道#3172rBy('name', 'asc')
这里是从哪里来的,是否对我的问题有任何影响。
解决方案
如果您从Genus
模型开始应该更容易,看到您想使用 Genus 名称开始排序,并且因为它与 具有一对多关系Species
,您可以尝试使用以下查询:
$webstore_genuses = Genus::orderBy('name', 'asc')
->with(['species' => function($query) {
$query->where('in_webstore', true)->orderBy('name', 'asc');
}])->get();
但不知道你能不能处理好你认为的结果,应该不难。
顺便说一句,通过您的查询,您要求 laravelSpecies
按名称排序,并为每个物种加载Genus
按名称排序的内容,但是Species
只有一个Genus
,因此排序没有意义。
更新:可能更好的方法是使用 ajoin
这样您就可以在用于检索的同一查询中对Genus
name 和name 进行排序,如下所示:Species
Species
$webstore_species = Species::->with('genus')
->where('in_webstore', true)
->join('genuses', 'genuses.id', '=', 'species.genus_id')
->orderBy('genuses.name', 'asc')
->orderBy('species.name', 'asc')
->get();
推荐阅读
- javascript - Component is not defined// React and Webpack
- python - IBMQProviderError:'没有符合条件的提供者'
- java - Try & Catch in double Array 未按预期工作
- haskell - 在 aeson-schemas 中,您如何构造 SchemaType 的对象而不编码为文本并解码回来?
- c# - 持续监视文件夹以将新创建的文件从该文件夹上传到 C# 中的 REST API
- python - 如何在 1 分钟后过期令牌?
- sql - 过滤后如何在一个查询中选择第一行和最后一行,然后在一个查询中的两个值的值之间进行计算
- c++ - OpenGL 鼠标输入 - 绘制函数
- javascript - 如何在多维数组中并排显示元素?
- python - 检查给定字符串是否仅包含一种字符的最佳方法