我在按多态的表关系对结果进行排序时遇到问题。 试了很多方法,结果没有排序。
我查看了很多线程,我尝试过的最终结果代码如下所示:
return \App\Models\Advert::with(['advertable' => function ($query) {
$query->orderBy('rooms', 'DESC');
}])->get();
我想按关系的“房间”列对“广告”表中的所有行进行排序,但没有任何反应。
我的表结构是:
<?php
// Main "adverts" polymorph table with advertable_id and advertable_type
class Advert extends \Illuminate\Database\Eloquent\Model
{
/**
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function advertable()
{
return $this->morphTo();
}
}
// "advert_flats" table
class Flat extends \Illuminate\Database\Eloquent\Model
{
/**
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function advert()
{
return $this->morphOne(\App\Models\Advert::class, 'advertable');
}
}
// "advert_homes" table
class Home extends \Illuminate\Database\Eloquent\Model
{
/**
* @return \Illuminate\Database\Eloquent\Relations\MorphOne
*/
public function advert()
{
return $this->morphOne(\App\Models\Advert::class, 'advertable');
}
}
更新
如果我转储 SQL,那么我会发现这段代码不会遇到关系
select * from `adverts` where `category_id` = 2 and `adverts`.`deleted_at` is null
我还尝试更改 whereHas 函数以处理多态关系,因为 Laravel 不支持 whereHas 与多态关系。
我已经运行了这段代码
return $model->whereHas('advertable', function ($q) {
$q->orderBy('rooms', 'DESC');
}, '>=', 1, ['\App\Models\Flat']);
但它也不对结果进行排序。 我不得不更改 Laravel 构建器以添加对多态表的支持。
更新 2
在应用 SortBy/SortByDesc 我手动构建 LengthAwarePaginator 之后,我已经使用@Sturm 回答提供的示例解决了问题并实现了代码。
但是在对我的查询调用 ->get() 方法之前,可以使用 Builder 类解决这个问题吗?
最佳答案
$adverts = \App\Models\Advert::query()->select(
DB::raw('
adverts.*,
CASE
WHEN adverts.advertable_type like(\'%Flat\') THEN advert_flats.rooms
WHEN adverts.advertable_type like(\'%Home\') THEN advert_homes.rooms
END
as rooms
')
)->leftJoin(
"advert_flats",
function ($join) {
/** @var \Illuminate\Database\Query\JoinClause $join */
$join->on('adverts.advertable_id', '=', "advert_flats.id")
->where('adverts.advertable_type', 'like', '%Flat');
}
)->leftJoin(
"advert_homes",
function ($join) {
/** @var \Illuminate\Database\Query\JoinClause $join */
$join->on('adverts.advertable_id', '=', "advert_homes.id")
->where('adverts.advertable_type', 'like', '%Home');
}
)->orderBy('rooms', 'ASC')->get();
关于php - Laravel 上的 OrderBy 多态一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814570/