thinkPHP5 多條件自定義排序

public function lists($filter){

        $join = [
            ['__USER__ au', 'e.up_user_id = au.id'],
            ['train_carbon uc','e.up_carbon_id = uc.id'],
            ['train_line l','l.id=e.line_id'],
            ['train_subway s','s.id=e.subway_id'],
            ['train_position p','p.id=e.position_id'],
        ];

        $field = 'e.*,au.user_nickname as up_user_nickname,uc.sign as up_carbon_sign,uc.ini_ply,l.name as line_name,s.name as subway_name,p.name as position_name';

        $reason_id = empty($filter['reason_id']) ? 0 : intval($filter['reason_id']);

        if (!empty($reason_id)) {
            array_push($join, [
                'train_down d', 'd.id = e.down_reason_id'
            ]);
            $field .= 'd.name as reason_name';
        }

        if(!empty($filter['down_start_time']) || !empty($filter['down_end_time'])){
            array_push($join, [
                'train_carbon dc', 'dc.id = e.down_carbon_id'
            ]);
            $field .= 'dc.sign as down_carbon_sign';
        }

        $positions =implode(',',Db::name('position')->column('id'));
        $lines = implode(',',Db::name('subway')->column('id'));
        $exp =new \think\db\Expression('field(e.subway_id,'.$lines.'),field(e.position_id,'.$positions.')');


        $enters        = Db::name('enter')
            ->comment('查詢錄入列表數(shù)據(jù)源')
            ->alias('e')
            ->field($field)
            ->join($join)
            ->where('e.status',1)
            ->where('e.on_time', '>=', 0)
            ->where(function (Query $query) use ($filter) {
                $line_id = empty($filter['line_id']) ? '' : intval($filter['line_id']);
                if (!empty($line_id)) {
                    $query->where('e.line_id', $line_id);
                }

                $subway_id = empty($filter['subway_id']) ? '' : intval($filter['subway_id']);
                if (!empty($subway_id)) {
                    $query->where('e.subway_id', $subway_id);
                }

                $position_id = empty($filter['position_id']) ? '' : intval($filter['position_id']);
                if (!empty($position_id )) {
                    $query->where('e.position_id', $position_id );
                }

                $user_id = empty($filter['user_id']) ? '' : intval($filter['user_id']);
                if (!empty($user_id )) {
                    $query->where('e.up_user_id',$user_id );
                }


                $reason_id = empty($filter['reason_id']) ? 0 : intval($filter['reason_id']);
                if (!empty($reason_id)) {
                    $query->where('e.down_reason_id', $reason_id);
                }

                $upstartTime = empty($filter['up_start_time']) ? 0 : strtotime($filter['up_start_time']);
                $upendTime   = empty($filter['up_end_time']) ? 0 : strtotime($filter['up_end_time']);
                if (!empty($upstartTime)) {
                    $query->where('e.on_time', '>=', $upstartTime);
                }
                if (!empty($upendTime)) {
                    $query->where('e.on_time', '<=', $upendTime);
                }

                $keyword = empty($filter['keyword']) ? '' : $filter['keyword'];
                if (!empty($keyword)) {
                    $query->where('uc.sign', 'like', "%$keyword%");
                }
                $status = empty($filter['status']) ? '' : $filter['status'];
                if ($status ==  2) {
                    $query->where('e.status', 'eq', 2);
                }elseif ($status ==  1){
                    $query->where('e.status', 'eq', 1);
                }else{
                    $query->where('e.status', 'in', '1,2');
                }
                if(!empty($filter['down_start_time']) || !empty($filter['down_end_time'])){
                    $downstartTime = empty($filter['down_start_time']) ? 0 : strtotime($filter['down_start_time']);
                    $downendTime   = empty($filter['down_end_time']) ? 0 : strtotime($filter['down_end_time']);
                    if (!empty($downstartTime)) {
                        $query->where('e.time', '>=', $downstartTime);
                    }
                    if (!empty($downendTime)) {
                        $query->where('e.time', '<=', $downendTime);
                    }
                }
            })
            ->order($exp)
            ->paginate(10)->each(function($item){
                if(!empty($item['down_reason_id'])){
                    $item['reason_name'] = Db::name('down')->where('id',$item['down_reason_id'])->value('name');
                    $item['down_carbon_sign'] = Db::name('carbon')->where('id',$item['down_carbon_id'])->value('sign');
                }else{
                    $item['reason_name'] = null;
                    $item['down_carbon_sign'] = null;
                }
                if(!empty($item['down_user_id'])){
                    $item['down_user_nickname'] = Db::name('user')->where('id',$item['down_user_id'])->value('user_nickname');
                }else{
                    $item['down_user_nickname'] = null;
                }
                $item['on_time'] = date('Y-m-d',$item['on_time']);
                if (empty($item['time'])){
                    $item['time'] = null;
                }else{
                    $item['time'] = date('Y-m-d',$item['time']);
                }
                if (empty($item['down_length'])){
                    $item['down_length'] = null;
                }
                if (empty($item['down_ply'])){
                    $item['down_ply'] = null;
                }
                return $item;
            });
        return $enters;
    }

自定義排序?yàn)椋喝绠?dāng)前有N個(gè)人 每個(gè)人手里都有一個(gè)蘋果,蘋果顏色分為紅黃藍(lán)三色,我需要在所有人排列時(shí)紅黃藍(lán)為一組且不影響數(shù)據(jù)的多少、若這一集合缺少某一個(gè)顏色的蘋果,還是屬于上個(gè)集合。

上述:(列車為一個(gè)一條數(shù)據(jù)的第一子項(xiàng) 每個(gè)列車對(duì)應(yīng)N多個(gè)安裝工位,我需要安裝工位的位置為一個(gè)集合排序。)tp5定義了解釋性條件語句(think\db\Expression)可做到如下排序。

如下圖所示內(nèi)容:


QQ截圖20190320104532.png

上述核心代碼:

 $positions =implode(',',Db::name('position')->column('id'));
$lines = implode(',',Db::name('subway')->column('id'));
$exp =new \think\db\Expression('field(e.subway_id,'.$lines.'),field(e.position_id,'.$positions.')');

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這個(gè)不錯(cuò)分享給大家,從扣上看到的,就轉(zhuǎn)過來了 《電腦專業(yè)英語》 file [fail] n. 文件;v. 保存文...
    麥子先生R閱讀 7,108評(píng)論 5 24
  • 1. file n. 文件;v. 保存文件2. command n. 命令指令3. use v. 使用用途4. p...
    喵嗚Yuri閱讀 828評(píng)論 0 4
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,301評(píng)論 0 52
  • 哪位大哥大姐能告訴我該怎樣去在乎一個(gè)人,我付出了真愛換來的只是一句不合適,這樣對(duì)嗎???
    心中的痛閱讀 122評(píng)論 0 0
  • 很多很多年前 我家有一張桌子缺了條腿 父親釘了塊木頭把它補(bǔ)上了 然后把一切都擺上桌子 告訴我它是堅(jiān)固的 只是我覺得...
    李唐的小詩閱讀 243評(píng)論 0 1

友情鏈接更多精彩內(nèi)容