簡體   English   中英

雄辯第一個where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM