我有问题通过polymorph的表关系对结果进行排序 . 尝试了很多方法,但结果并没有排序 .
我查看了很多线程,我尝试过的最终结果代码如下所示:
return \App\Models\Advert::with(['advertable' => function ($query) {
$query->orderBy('rooms', 'DESC');
}])->get();
我想按关系的“房间”列对“广告”表中的所有行进行排序,但没有任何反应 .
我的表结构是:
Laravel模型如下所示:
<?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');
}
}
UPDATE
如果我转储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构建器以添加对多态表的支持 .
UPDATE 2
我已经使用@Sturm answer提供的示例解决了问题并实现了代码,在应用SortBy / SortByDesc后,我手动构建了LengthAwarePaginator .
但是在我的查询中调用 - > get()方法之前,是否可以使用Builder类解决此问题?
2 回答
这里有一些可以让你跑步的东西,虽然我会更多地看一下是否有办法从Builder中做到这一点 .