【问题标题】:Constrained eager load not performing the additional query受约束的急切负载不执行附加查询
【发布时间】:2019-12-24 05:03:03
【问题描述】:

我想加载一个 Species 的集合,按 Genus 的“name”列排序,然后按它们自己的“name”列排序。

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

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    如果您从Genus 模型开始应该更容易,看到您想从属名开始订购并且因为它与Species 具有一对多关系,您可以尝试使用以下查询:

    $webstore_genuses = Genus::orderBy('name', 'asc')
        ->with(['species' => function($query) {
            $query->where('in_webstore', true)->orderBy('name', 'asc');
        }])->get();
    

    不过不知道你能不能处理好你认为的结果,应该不难吧。

    顺便说一句,您的查询要求 laravel 按名称排序所有Species,并为每个物种加载按名称排序的Genus,但Species 只有一个Genus,所以排序没有意义.

    更新:可能更好的方法是使用join,这样您就可以在用于检索Species 的同一查询中对Genus 名称和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();
    

    【讨论】:

    • @stroomschok 对此答案有何反馈?
    【解决方案2】:

    基本上是 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();
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2015-08-31
      • 2015-03-19
      相关资源
      最近更新 更多