2015-10-19 5 views
4

мне интересно, как Laravel реализовать красноречивый синтаксис так, что первый, где положение можно назвать статически User::where()Eloquent первый, где положение

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

Есть ли у них public static function where() и public function where()

+0

Ответ: [магические методы] (http://www.php.net/manual/en/language.oop5.magic.php), в частности '__callStatic()' и '__call()' –

ответ

4

Вызов 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, следующий магический метод PHP __call который определен в 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); 
} 

связанных с общей базой данных становится доступной через:

$query = $this->newQuery(); 

Это создает новый объект Красноречивого конструктора запросов, и это на данном объекте, что метод where работает.

Таким образом, когда вы используете `` `User :: где()` `вы на самом деле с помощью:

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

Посмотрите на Builder class, чтобы увидеть все общие красноречивые методы, которые вы используется для использования, как where(), get(), first(), update() и т.д.

Laracasts имеет большой (платный) видео углубленного о том, как Eloquent работает за кулисами, которые я рекомендую.

1

Ну давайте найдем вне.

Когда мы открываем модель, она расширяет Model, поэтому давайте откроем этот класс. В классе Model мы находим 2 «магические» методы, называемые __call() и __callStatic()

__call() запускается при вызове недоступные методы в контексте объекта.

__callStatic() инициируется при вызове недосягаемых методов в статическом контексте.

Мы также видим в классе Model он использует класс use Illuminate\Database\Query\Builder as QueryBuilder;

Если мы открываем Builder класс мы находим метод, называемый public function where()

Так что, если вы звоните User::where он называет __callStatic('where', $parameters) из Model класса ,

Надеюсь, это имеет смысл.

Смежные вопросы