我想加载一个物种集合,按其属的“名称”列排序,然后按其自己的“名称”列排序。
$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')
是什么,是否与我的问题有关。
答案 0 :(得分:0)
如果从Genus
模型开始应该更容易,因为您想开始以属名开始订购,并且因为它与Species
有一对多的关系,因此可以尝试使用此查询:
$webstore_genuses = Genus::orderBy('name', 'asc')
->with(['species' => function($query) {
$query->where('in_webstore', true)->orderBy('name', 'asc');
}])->get();
但是我不知道您是否可以处理结果,这应该不难。
BTW与您的查询一起,您要求laravel获取所有按名称排序的Species
,并为每种物种加载按名称排序的Genus
,但是Species
只有一个{{1 }},因此排序没有任何意义。
更新:可能更好的方法是使用Genus
,以便您可以在用于查询的同一查询中以join
名称和Genus
名称进行排序检索Species
,如下所示:
Species
答案 1 :(得分:0)
dparoli所说的基本上。使用...
->with(['genus' => function($query) {
$query->orderBy('name', 'asc');
}])
...您正在按名称在每个物种Genuses中应用顺序,该顺序始终是一个,因此基本上什么都不做。
您应该使用点符号来应用订单:
$webstore_species = Species::with('genus')
->where('in_webstore', true)
->orderBy('genus.name', 'asc')
->orderBy('name', 'asc')
->get();