Laravel源碼閱讀第二次

Builder::where

源碼
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
    if (is_array($column)) {
        return $this->whereNested(function ($query) use ($column) {
            foreach ($column as $key => $value) {
                $query->where($key, '=', $value);
            }
        }, $boolean);
    }

    if (func_num_args() == 2) {
        list($value, $operator) = [$operator, '='];
    } elseif ($this->invalidOperatorAndValue($operator, $value)) {
        throw new InvalidArgumentException('Illegal operator and value combination.');
    }

    if ($column instanceof Closure) {
        return $this->whereNested($column, $boolean);
    }

    if (! in_array(strtolower($operator), $this->operators, true)) {
        list($value, $operator) = [$operator, '='];
    }

    if ($value instanceof Closure) {
        return $this->whereSub($column, $operator, $value, $boolean);
    }

    if (is_null($value)) {
        return $this->whereNull($column, $boolean, $operator != '=');
    }

    $type = 'Basic';

    $this->wheres[] = compact('type', 'column', 'operator', 'value', 'boolean');

    if (! $value instanceof Expression) {
        $this->addBinding($value, 'where');
    }

    return $this;
}
解讀
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
    //如果參數(shù)column是一個(gè)數(shù)組赴涵,將假設(shè)這個(gè)數(shù)組是一個(gè)“字段”-“值”對應(yīng)的關(guān)系對
    //并且默認(rèn)這些查詢條件是并列存在的關(guān)系刨肃,即需滿足所有的where數(shù)組贸典,參見示例1
    
    //如果傳遞了兩個(gè)參數(shù),將假設(shè)$popertor為“=”演训,否則將會(huì)拋出一個(gè)異常允悦,參見示例2
    
    //如果$column是一個(gè)閉包,暫時(shí)不能理解如果是一個(gè)閉包會(huì)發(fā)生什么莲趣,只知道允許$column是一個(gè)閉包鸳慈。o(╯□╰)o
    
    //參數(shù)$operator有一個(gè)允許的范圍,如果不在允許范圍之內(nèi)喧伞,則默認(rèn)$operator為“=”走芋,參見示例4
    
    //如果第三個(gè)參數(shù)$value是一個(gè)閉包,同$column閉包潘鲫,不能理解...翁逞,參見示例3
    
    //如果$value是空的
}
示例1
User::where([
    "name"  => "Zoe",
    "gender"  => "male"
], null, null, "or") -> get();
不管后面的三個(gè)參數(shù)如何變,最終的sql都是:“select * from `usr_userinfo` where (`id` = ? and `nickname` = ?)”溉仑。
示例2
User::where("id", "4")->...
等于User::where("id", "=", 4)->...
示例3
User::where("foo", "=", function($query){
  $query -> from((new CmsUser()) -> getTable()) -> where("fiz", "biz");
}) -> toSql();
//select * from `usr_userinfo` where `foo` = (select * from `cms_user` where `fiz` = ?)
示例4
允許的operator參數(shù)
'=', '<', '>', '<=', '>=', '<>', '!=',
'like', 'like binary', 'not like', 'between', 'ilike',
'&', '|', '^', '<<', '>>',
'rlike', 'regexp', 'not regexp',
'~', '~*', '!~', '!~*', 'similar to',
'not similar to'
啟示

一般是通過模型調(diào)用靜態(tài)方法where去實(shí)現(xiàn)查詢挖函,但在model里面并沒有where這一個(gè)方法,可以清楚的是浊竟,最終是通過調(diào)用builder::where來實(shí)現(xiàn)最終的查詢怨喘。那么,在model里面是怎么找到builder::where的呢振定?
Eloquent::model下面看到了如下代碼:

public function __call($method, $parameters)
{    
    if (in_array($method, ['increment', 'decrement'])) {        
        return call_user_func_array([$this, $method], $parameters);    
    }    
    $query = $this->newQuery();    
    return call_user_func_array([$query, $method], $parameters);
}

public static function __callStatic($method, $parameters)
{
    $instance = new static;    
    return call_user_func_array([$instance, $method], $parameters);
}

通過__call__callStatic這兩個(gè)魔術(shù)方法實(shí)現(xiàn)了對不可訪問的方法的訪問(another time, I will note them)必怜。
builder里面,laravel對函數(shù)功能進(jìn)行了特別細(xì)致和合理的劃分后频,比如對builder類中屬性$binding的操作梳庆。首先有一個(gè)設(shè)置$binding的函數(shù)setBindings(array $bindings, $type = "where"),對$this->binding進(jìn)行初始化。與之相對的靠益,builder還提供了獲取$this->builder的函數(shù)getBindings()getRawBindings()(暫時(shí)不能區(qū)分兩者)丧肴。然后提供了對$this->binding的添加操作addBinding($value, $type = "where"),和mergeBindings(Builder $query)胧后。
這些函數(shù)其實(shí)就是針對屬性$this->binding的增刪改查芋浮,對$this->binding生命周期的控制(參見vue2.0的生命周期)。一個(gè)優(yōu)秀的程序無非就是由這些“元”操作組成壳快,在語言層面纸巷,各種語言已經(jīng)為我們封裝了一層。寫程序眶痰,就是在程序?qū)用媪鲋迹槍Σ煌臉I(yè)務(wù),將整個(gè)流程分解成一個(gè)個(gè)不可細(xì)分竖伯、可以重復(fù)使用的“元”模塊存哲,一個(gè)個(gè)“元”類,一個(gè)個(gè)“元”函數(shù)七婴。
對于流程祟偷,我們會(huì)不斷的重復(fù),因?yàn)闃I(yè)務(wù)不可能只是針對單人或者單次打厘。我們就像拼積木一樣對整個(gè)過程進(jìn)行拆解修肠,在類和函數(shù)的內(nèi)部,我們不能信任任何輸入户盯,我們需要在每一個(gè)“元”保持輸入的可靠性嵌施,這大概就是“低內(nèi)聚、高耦合”了吧莽鸭。對輸入進(jìn)行檢查吗伤,檢查類型和值,只有得到符合要求的數(shù)據(jù)時(shí)才能進(jìn)行下一步功能操作蒋川,輸出時(shí)也要對數(shù)據(jù)進(jìn)行過濾牲芋,給對方想要的數(shù)據(jù),只給對方想要的數(shù)據(jù)捺球。
而流程針對用戶,則體現(xiàn)為我做了什么夕冲、我要做什么际歼、我沒有做什么蒲列、我應(yīng)該怎么做、做完之后我該怎么辦、如果我沒做又會(huì)怎么樣慨畸。比如今天Boss讓我做一個(gè)針對案件的通知管理倘屹,因?yàn)檫@個(gè)通知不是“我”發(fā)出去的,也無法修改,更不可以刪除掺涛,所以從增刪改查的角度,我只是對通知做了一個(gè)顯示疼进,完全沒有考慮到如果通知沒法出去怎么辦薪缆?應(yīng)該在哪些步驟發(fā)通知,發(fā)了還是沒發(fā)伞广?沒發(fā)要怎么發(fā)拣帽?說來也是奇怪,Boss最近好像心情比較好嚼锄,之前拿一些比較棘手的問題去資訊他减拭,他都會(huì)不是很耐煩,今天我完全沒搞懂應(yīng)該怎么寫区丑,他還耐心的給我解釋了好久拧粪,很奇怪。大概是因?yàn)榱鞒毯苤匾伞?/p>

vue2.0生命周期
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
activated
deactivated
beforeDestroy
destroyed
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沧侥,一起剝皮案震驚了整個(gè)濱河市可霎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌正什,老刑警劉巖啥纸,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婴氮,居然都是意外死亡斯棒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門主经,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荣暮,“玉大人,你說我怎么就攤上這事罩驻∷胨郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵惠遏,是天一觀的道長砾跃。 經(jīng)常有香客問我,道長节吮,這世上最難降的妖魔是什么抽高? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮透绩,結(jié)果婚禮上翘骂,老公的妹妹穿的比我還像新娘壁熄。我一直安慰自己,他們只是感情好碳竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布草丧。 她就那樣靜靜地躺著,像睡著了一般莹桅。 火紅的嫁衣襯著肌膚如雪昌执。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天统翩,我揣著相機(jī)與錄音仙蚜,去河邊找鬼。 笑死厂汗,一個(gè)胖子當(dāng)著我的面吹牛委粉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娶桦,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贾节,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衷畦?” 一聲冷哼從身側(cè)響起栗涂,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祈争,沒想到半個(gè)月后斤程,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菩混,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年忿墅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沮峡。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疚脐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邢疙,到底是詐尸還是另有隱情棍弄,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布疟游,位于F島的核電站呼畸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颁虐。R本人自食惡果不足惜役耕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聪廉。 院中可真熱鬧瞬痘,春花似錦、人聲如沸板熊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽干签。三九已至津辩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間容劳,已是汗流浹背喘沿。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竭贩,地道東北人蚜印。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像留量,于是被迫代替她去往敵國和親窄赋。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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