首页 > 解决方案 > 受约束的急切负载不执行附加查询

问题描述

我想加载一个物种的集合,按其属的“名称”列排序,然后按他们自己的“名称”列排序。

$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')这里是从哪里来的,是否对我的问题有任何影响。

标签: laraveleloquent

解决方案


如果您从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这样您就可以在用于检索的同一查询中对Genusname 和name 进行排序,如下所示:SpeciesSpecies

$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();

推荐阅读