[英]Eloquent the first where clause
我想知道Laravel如何實現雄辯的語法,以便可以使用User::where()
靜態調用第一個where子句
User::where('id', 23)->where('email', $email)->first();
他們有一個public static function where()
和一個public function where()
調用where
的一個雄辯的模型沒有涉及發生在幕后的神奇一點點。 首先,舉個例子:
User::where(’name’, ‘Joe’)->first;
有沒有靜態where
,關於存在的方法Model
該類User
類擴展。
會發生什么,是調用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();
這實例化了一個新的Eloquent查詢構建器對象,並且在此對象上運行where
方法。
所以,當你使用```User :: where()``你實際上使用的時候:
Illuminate\Database\Eloquent\Builder::where()
看一下Builder類 ,看看你習慣使用的所有常用Eloquent方法,比如where()
, get()
, first()
, update()
等。
Laracasts有一個非常深入(付費)的視頻,講述了Eloquent在幕后的工作方式,我建議這樣做。
好吧,讓我們找出答案。
當我們打開一個模型時,它擴展了Model
所以讓我們打開那個類。 在類Model
我們找到了2個名為__call()
和__callStatic()
“魔法”方法
在對象上下文中調用不可訪問的方法時會觸發__call()
。
在靜態上下文中調用不可訪問的方法時會觸發__callStatic()
。
我們還在類Model
看到它使用類use Illuminate\\Database\\Query\\Builder as QueryBuilder;
如果我們打開Builder
類,我們找到一個名為public function where()
的方法public function where()
因此,如果您調用User::where
它從Model
類調用__callStatic('where', $parameters)
。
我希望這是有道理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.