Некоторое время я задавался вопросом, почему это работает. Я некоторое время работаю с Laravel 5.1, и теперь я хочу создать свою собственную структуру (только для обучения). На данный момент я подключаюсь к моделям и соединениям с базой данных, а затем появляется этот файл. Это расширение моделей, таких как модели состояния и пользователя.
https://github.com/illuminate/database/blob/master/Eloquent/Model.php
Это абстрактный класс модели, который не так уж плох. При настройке проекта Laravel 5.1 будет существовать класс User, который расширяет его, это возможно выполнить
User::where('username', 'Rasmus');
Пользователь - это модель пользователя, которая расширяет абстрактный класс модели
"имя пользователя" относится к столбцу базы данных
"Расмус" - это то, что он ищет в этой колонке, это мое имя...
Интересная часть и главное в этом вопросе заключается в том, что в классе модели нет класса "where", ни в классе "Пользователь". Класс Model НЕ наследует ничего. Может ли кто-нибудь объяснить мне, почему это работает (вызов User :: where), когда метод не существует.
Полезно знать, что static::where(...);
называется несколько раз в абстрактном классе модели.
С уважением, Расмус Розенгрен
Соучредитель PHP-ученика
__call()
Model
__call()
передает ее в экземпляр QueryBuilder
(с несколькими шагами между ними, но это основной результат).
public function __call($method, $parameters)
{
...
$query = $this->newQuery();
return call_user_func_array([$query, $method], $parameters);
}
__call()
- волшебный метод, который позволяет приложению иметь дело с отсутствующим/недоступным именем метода. В этом случае он позволяет использовать различные методы where()
(в том числе возможность делать такие вещи, как определенно неопределенные функции, такие как whereUsername('Rasmus')
).
Я не программирую эксперт, и я ожидаю лучшего ответа на это. Однако вас может заинтересовать QueryBuilder в строке 447. В то время как на Model.php вы можете увидеть, что он использует QueryBuilder в строке 27.
Как я помню, Laravel использует черту для обработки нескольких повторных использования кода. Это довольно продвинутая тема - это довольно интересно.
Eloquent\Builder
. Это элегантно, но крайне медленно, поскольку полагается на рефлексию.__call()
вModel
.