预先加载关系排序在Laravel中不起作用



我正在尝试使用Eager Loading在Laravel中按关系动态排序。

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

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

select * from some_table;在"some_table"!"deleted_at"null"

无论我是否orderBy('column', 'ASC')orderBy('column', 'DESC')没有ddtoSql,我得到相同的输出,如果它忽略了整个渴望负载。

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

class SomeModel
{
protected $table = 'some_table'; # for visual aid

public function someRelation(): BelongsTo
{
$this->belongsTo(SomeOtherModel::class)->select('id', 'column');
}
}

供参考,稍后会有更多的调试。我试着看看这个函数是否执行过,它确实执行了:

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

dd块执行,告诉我执行的函数,并给我:

select "id";name"从"some_other_table"在"some_other_table"!"id"(?, ?)和"some_other_table"按"名称"排序为空。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,如果你不期望所有的数据,只是做一些空异常处理。

我实际上创建了一个抽象类,它具有全局作用域,可以基于散列映射方法在任何模型中动态地执行此操作。

最新更新