php - Laravel 上的 OrderBy 多态一对一关系

标签 php mysql laravel eloquent

我在按多态的表关系对结果进行排序时遇到问题。 试了很多方法,结果没有排序。

我查看了很多线程,我尝试过的最终结果代码如下所示:

return \App\Models\Advert::with(['advertable' => function ($query) {
    $query->orderBy('rooms', 'DESC');
}])->get();

我想按关系的“房间”列对“广告”表中的所有行进行排序,但没有任何反应。

我的表结构是:

enter image description here 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');
    }
}

更新

如果我转储 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/

相关文章:

php - 从多列排序

php - Laravel Breeze - Tailwind CSS 未在登录和注册页面上加载

php - 在 PHP 中更改 the_post_thumbnail 的输出

php - 如何将 session 添加到我的表单中?

php - 查询 MySQL 数据库以显示选定行和所有行

php - 返回给定时间/日期的可用性

php - Laravel 5 - 如何计算连接和分组的总记录数

php - MySQL PDO 准备比查询更快?这就是这个简单的测试所显示的

php - 谷歌图表中未显示确切值

javascript - 从mysql获取日期时间到php?