繁体   English   中英

急切加载排序依据的关系在 Laravel 中不起作用

[英]Eager loading relationships to sort by is not working in Laravel

我正在尝试使用预加载按 Laravel 中的关系动态排序。

dd(SomeModel::with(['someRelation' => function ($query) {
    $query->orderByDesc('column');
})->toSql());

我正在使用dd()toSql()来尝试调试正在发生的事情,这就是我所看到的:

“从“some_table”中选择 *,其中“some_table”。“deleted_at”为空”

无论我是orderBy('column', 'ASC')还是orderBy('column', 'DESC')没有ddtoSql ,我都会得到相同的 output ,就好像它忽略了整个急切的负载。

我错过了什么或做错了什么吗? 我在这种情况下的关系是这样的:

class SomeModel
{
    protected $table = 'some_table'; # for visual aid
    
    public function someRelation(): BelongsTo
    {
        $this->belongsTo(SomeOtherModel::class)->select('id', 'column');
    }
}

仅供参考,稍后再进行一些调试。 我试图尝试查看 function 是否曾经执行过,它确实执行过:

SomeModel::with(['someRelation' => function ($query) {
    $query->orderByDesc('column');
    dd($query->toSql());
});

dd块执行告诉我 function 执行并给我:

“从“some_other_table”中选择“id”,“name”,其中“some_other_table”。“id”在(?,?)和“some_other_table”中。“deleted_at”是 null 按“name”desc 排序“

任何帮助表示赞赏。

更新以检查子查询 SQL:

\DB::enableQueryLog();

SomeModel::with(['someRelation' => function ($test) {
    $test->orderBy('name', 'DESC');
}])->get();

dd(\DB::getQueryLog());

这会返回一个空数组:

[]

在阅读完@TimLewis 提到的整篇文章后,我选择了join解决方案。

SomeModel::query()->select('some_table.id', 'some_table.name') # Only bring back what we need without the join
    ->join('some_other_table', 'some_other_table.id', '=', 'some_table.some_other_table_id')
    ->orderByDesc('column');

或者,如果您不希望一直收到数据,您可以随时leftJoin ,只需进行一些 null 异常处理即可。

我实际上创建了一个抽象 class,它有一个全局 scope 以基于哈希映射方法在任何 Model 中动态地执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM