讓Phalcon的Model支持關(guān)聯(lián)數(shù)組條件查詢

用TP的同學(xué)一定非常熟悉數(shù)組批量字段查詢埠对,在一些條件較多但并不復(fù)雜的查詢中斩祭,這種方式非潮啵快捷尖啡。但Phalcon沒有自帶,所以我在代碼中對(duì)Model做了一層封裝剩膘,用以處理數(shù)組查詢衅斩。

<?php
namespace app\models;

use Phalcon\Mvc\Model;

class MyBaseModel extends Model
{

    // 關(guān)聯(lián)數(shù)組查詢
    static public function arrFind($arr, $relation='and', $assist=[])
    {
        $parameters = self::dealWithWhereArr($arr, $relation, $assist);
        // 查詢返回
        return self::find($parameters);
    }

    // 關(guān)聯(lián)數(shù)組查詢
    static public function arrFindFirst($arr, $relation='and', $assist=[])
    {
        $parameters = self::dealWithWhereArr($arr, $relation, $assist);
        // 查詢返回
        return self::findFirst($parameters);
    }

    // 分頁查詢
    static public function arrFindPage($pageSize, $pageNum, $arr, $relation='and', $assist=[])
    {
        $count = self::count(self::dealWithWhereArr($arr, $relation, $assist));
        $offset = $pageSize*($pageNum-1);
        $assist['limit'] = [(int)$pageSize, (int)$offset];
        $list = self::arrFind($arr, $relation, $assist)->toArray();
        $meta = [
            'total' => $count,
            'pageNum' => $pageNum,
            'pageSize' => $pageSize
        ];
        self::keyToHump($list);
        return [
            'list' => $list,
            'meta' => $meta
        ];
    }

    /**
     * 組裝關(guān)聯(lián)數(shù)組查詢
     * @param $arr 關(guān)聯(lián)數(shù)組,支持類TP的[k=>['>',6], k=>['not null'], k=>['IN', Arr]]
     * @param string $relation
     * @param array $assist
     * @return array
     */
    static public function dealWithWhereArr($arr, $relation='and', $assist=[])
    {
        if (isset($arr['bind']) && is_array($arr['bind'])){
            return $arr;
        }
        if (is_array($relation)){
            $assist = array_merge($relation, $assist);
            $relation = 'and';
        }
        // 預(yù)處理conditions
        $conditions = [];
        $bind = [];
        foreach ($arr as $k => $v){
            $bindKey = str_replace('.', '__', $k); // SQL綁定參數(shù)變量名中不可有符號(hào).
            if (!is_array($v)){
                $conditions[] = $k.' = :'.$bindKey.':';
                $bind[$bindKey] = $v;
                continue;
            }
            if (isset($v[1]) && is_array($v[1])){
                $conditions[] = "{$k} {$v[0]} ({{$bindKey}:array})";
                $bind[$bindKey] = $v[1];
                continue;
            }
            $conditions[] = $k.' '.implode(' ', $v);
        }
        $conditions = implode(" {$relation} ", $conditions);
        // 查詢返回
        return array_merge([
            'conditions' => $conditions,
            'bind' => $bind,
        ], $assist);
    }

    /**
     * 數(shù)組鍵名下劃線轉(zhuǎn)駝峰
     * @param $list
     * @return array
     */
    static public function keyToHump(&$list){
        if (!is_array($list)){
            return $list;
        }
        $newList = [];
        foreach ($list as $k => $item){
            if (is_numeric($k)){
                $newList[] = self::keyToHump($item);
                continue;
            }
            $humpKey = preg_replace_callback('/([-_]+([a-z]{1}))/i',function($matches){
                return strtoupper($matches[2]);
            },$k);
            $newList[$humpKey] = $item;
        }
        $list = $newList;
        return $newList;
    }

    /*// 捕捉驗(yàn)證器失敗結(jié)果到全局變量
    protected function validate($validator){
        $bol = parent::validate($validator);
        if (!$bol){
            $Messages = $this->getMessages();
            foreach ($Messages as $msg){
                $GLOBALS['ExceptionTipsMsg'][] = $msg->getMessage();
            }
        }
        return $bol;
    }*/
}

表繼承后就可以使用類似下面的查詢方式

// 單表查詢
Drivers::arrFind([
    'id' => ['IN', $driverIdList],
    'age' => ['>', 6],
    'test' => ['not null'],
], 'and', [
    'columns' => 'id, real_name AS realName'
])->toArray();

// 多表?xiàng)l件預(yù)處理
$parameter = [
    'a.age' => ['>', 12],
    'b.status' => ['IN', [2, 3]],
];
$where = MyBaseModel::dealWithWhereArr($parameter);
$model =  $this->modelsManager->createBuilder()
    ->addfrom('app\models\Test\A','a')
    ->join('app\models\Test\B', 'b.a_id = a.id','b')
    ->where($where['conditions'], $where['bind'])
    ->getQuery()
    ->execute()
    ->toArray();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怠褐,一起剝皮案震驚了整個(gè)濱河市畏梆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奈懒,老刑警劉巖具温,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異筐赔,居然都是意外死亡铣猩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門茴丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來达皿,“玉大人,你說我怎么就攤上這事贿肩÷鸵” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汰规,是天一觀的道長(zhǎng)汤功。 經(jīng)常有香客問我,道長(zhǎng)溜哮,這世上最難降的妖魔是什么滔金? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任色解,我火速辦了婚禮,結(jié)果婚禮上餐茵,老公的妹妹穿的比我還像新娘科阎。我一直安慰自己,他們只是感情好忿族,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布锣笨。 她就那樣靜靜地躺著,像睡著了一般道批。 火紅的嫁衣襯著肌膚如雪错英。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天隆豹,我揣著相機(jī)與錄音走趋,去河邊找鬼。 笑死噪伊,一個(gè)胖子當(dāng)著我的面吹牛簿煌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鉴吹,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姨伟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了豆励?” 一聲冷哼從身側(cè)響起夺荒,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎良蒸,沒想到半個(gè)月后技扼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫩痰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年剿吻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串纺。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丽旅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纺棺,到底是詐尸還是另有隱情榄笙,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布祷蝌,位于F島的核電站茅撞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜米丘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一剑令、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠕蚜,春花似錦尚洽、人聲如沸悔橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽癣疟。三九已至挣柬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睛挚,已是汗流浹背邪蛔。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扎狱,地道東北人侧到。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淤击,于是被迫代替她去往敵國和親匠抗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容