如何在 Laravel 中按关系对产品进行排序?

问题描述 投票:0回答:1

我过滤并列出了下面模型页面上的代码示例列出的产品以及来自用户的一些数据。

我想根据价格对列出的产品进行排序。然而,正如 minprice-maxprice 示例代码块中所示,关系取决于几个条件。

从用户收到的postFrom和postTo日期组成的周期中,如果daily为0,则按照old_daily价格列出,如果daily不为0,则按照每日价格列出。

我该怎么做?

我的模型页面

public $belongsTo = [
    'price' => [
        'ac\prices\models\Price',
        'key' => 'id',
        'otherKey' => 'pro_id',
    ],
]

public static $allowedSortingOptions = array (
    'name desc' => 'Name - desc',
    'name asc' => 'Name - asc',
    'price desc' => 'Price - desc',
    'price asc' => 'Price - asc',
);

public function scopeListFrontEnd($query, $options = []){

    extract(array_merge([
        'page' => 1,
        'perPage' => 10,
        'sort' => 'created_at desc',
        'postFrom' => null,
        'postTo' => null,
        'minPrice' => null,
        'maxPrice' => null,
    ], $options));

    if(!is_array ($sort)){
        $sort = [$sort];
    }

    foreach ($sort as $_sort){
        if(in_array($_sort, array_keys(self::$allowedSortingOptions))){
            $parts = explode(' ', $_sort);

            if(count($parts) < 2){
                array_push($parts, 'desc');
            }

            list($sortField, $sortDirection) = $parts;

            $query->orderBy($sortField, $sortDirection);

        }
    }

    if($minPrice != null) {

        if(!is_array($minPrice)){
            $minPrice = [$minPrice];
        }

        foreach ($minPrice as $mnPrice){

            $query->whereHas('price', function($q) use ($mnPrice,$maxPrice,$postFrom,$postTo){
                $q->where('daily', '==', '0')
                ->where(function( $query ) use ( $mnPrice, $maxPrice ) {
                    $query->where('old_daily', '>=', $mnPrice);
                    $query->where('old_daily', '<=', $maxPrice[0]);
                });
                $q->orWhere('daily', '!=', '0')
                ->where(function( $query ) use ( $mnPrice, $maxPrice ) {
                    $query->where('daily', '>=', $mnPrice);
                    $query->where('daily', '<=', $maxPrice[0]);
                });
                $q->when($postFrom == '0', function ($sq) {
                        $sq->where('id', '>', '0');
                    }, function ($ssq) use ($postFrom, $postTo) {
                        $ssq->where(function($q) use ($postFrom) {
                            $q->whereDate('start_date', '<=', $postFrom[0])
                                ->whereDate('end_date', '>=', $postFrom[0]);
                        })->orWhere(function($q) use ($postTo) {
                            $q->whereDate('start_date', '<=', $postTo[0])
                                ->whereDate('end_date', '>=', $postTo[0]);
                        });
                        
                    });
            });

        }
    
    }

    $lastPage = $query->paginate($perPage, $page)->lastPage();

    if($lastPage < $page){
        $page = 1;
    }
    
    return $query->paginate($perPage, $page);

}
php laravel octobercms
1个回答
1
投票

如果不尝试准确解码您在这里想要执行的操作,我将添加一个子查询选择,将

sort_price
字段拉入结果中,然后您可以 orderBy。

$query->selectRaw('CASE WHEN daily = 0 THEN old_daily ELSE daily END as sort_price');

$query->orderByRaw('(SELECT sort_price)');

如果您的结果中不需要此价格,您也可以按照 MYSQL ORDER BY CASE Issue 直接在排序条件中执行此操作。

您可以在

orderByRaw
构建器方法中执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.