2015-10-19 83 views
4

我想知道Laravel如何實現雄辯的語法,使得第一where子句可以靜態地User::where()雄辯第一where子句

User::where('id', 23)->where('email', $email)->first(); 

被稱爲他們有一個public static function where()public function where()

+0

答案是[magic methods](http://www.php.net/manual/en/language.oop5.magic.php),具體是'__callStatic()'和'__call()' –

回答

4

在Eloquent模型上調用where確實涉及幕後發生的一點魔法。首先,採取的例子:

User::where(’name’, ‘Joe’)->first; 

還有,關於該User類擴展Model類不存在靜態where方法。

發生什麼事情,是PHP魔術方法__callStatic被調用,它試圖然後調用where方法。

public static function __callStatic($method, $parameters) 
{ 
    $instance = new static; 

    return call_user_func_array([$instance, $method], $parameters); 
} 

既然沒有所謂的where明確定義用戶的功能,則執行其在Model定義的下一個魔術PHP方法__call

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); 
} 

常見的數據庫相關的方法,通過成爲訪問:

$query = $this->newQuery(); 

此實例化一個新的雄辯查詢生成器對象,它的這個對象的where方法上運行。

所以,當你使用```用戶::其中()``你實際使用:

Illuminate\Database\Eloquent\Builder::where() 

看看在Builder class看到所有的你共同雄辯方法習慣使用,像where()get()first()update()

Laracasts有很大深度(付費)視頻多麼激情的場面,我建議後面的作品。

1

那麼讓我們找到出。

當我們打開一個模型時,它擴展了Model所以讓我們打開這個類。 在類Model,我們發現2「神奇」的方法稱爲__call()__callStatic()

__call()在對象範圍內調用方法不可訪問時被觸發。

__callStatic()在調用靜態上下文中不可訪問的方法時被觸發。

我們也看到在Model類是利用類use Illuminate\Database\Query\Builder as QueryBuilder;

的。如果我們打開Builder類,我們找到一個名爲public function where()

方法所以,如果你User::where它從Model類調​​用__callStatic('where', $parameters)

我希望這是有道理的。