關於laravel ModelClassName::where() vs ModelClassName::getTable()

coding時候思惟定式,就寫出了這樣的代碼php

$model = xxxModel::class;
$model::from($model::getTable() . ' as ' . $tableAlia);

運行錯誤提示:  getTable 是non-static 不能夠靜態調用;ui

因而 想起 this

          一 : Model::where() 是ok的code

          二: Eloquent\Model 類是有__callStatic的rem

沒細想就搜了網上,因而 有人問了這個問題 可是網上搬出來的是 鳥哥的關於 靜態方法的判斷不是根據 ::符號,而是根據調用的上下文--calling scope .get

可是提問隨後拋出 where 爲什麼正常;io

==============table

理解:function

若是該類存在同名方法,可是未聲明爲 static, 則運行階段會根據這個狀況拋錯;class

若是該類不存在該同名方法,則嘗試走 __callStatic ;

==========================

Model::where() 實際走的是本身的__callStatic,

public static function __callStatic($method, $parameters)
    {
        return (new static)->$method(...$parameters);
    }

============================

由於Model類內部不存在where方法,因此又走了 __call

public function __call($method, $parameters)
    {
        if (in_array($method, ['increment', 'decrement'])) {
            return $this->$method(...$parameters);
        }
        //$this->newQuery() 實例化 \Illuminate\Database\Eloquent\Builder類
        return $this->newQuery()->$method(...$parameters);
    }

因此 where 實際是調用的 Eloquent\Builder 的where 方法;而 getTable gg

相關文章
相關標籤/搜索