受约束的急切负载未执行附加查询

时间:2019-08-18 22:48:54

标签: laravel eloquent

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

$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')是什么,是否与我的问题有关。

2 个答案:

答案 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();