Зная, когда это Модель или Строитель (Laravel)
User::where('id',1)->update([])
а также User::find(1)->update([])
делать то же самое, но по-разному.
э?
При работе с базами данных в Laravel вы обычно либо используете Красноречивый или нижний уровень Свободные запросы.
Eloquent предоставляет способы «объективизации» работы с базами данных с помощью запросов Fluent. Просто поместите его в оболочку для запросов Fluent с дополнительным сыром. .
Некоторые базовые механизмы.
В общем, все, что касается Свободные запросы можно найти в пространстве имен Illuminate\Database\Query\Builder
И все Eloquent под Illuminate\Database\Eloquent\Model
Далее в Красноречивый
Если вы знаете, что знаете
Красноречивый также имеет много частей, главная точка притяжения Класс модели, Свой собственный Класс построителя запросов а также другие важные классы, такие как связи и т.п.
Примеры Теперь давайте попробуем разбить пару запросов.
User::where('id',1)
: Это утверждение начинается как красноречивая модель, а затем однажды куда называется возвращенным экземпляром красноречивого построителя, что означает, что вы можете добавить больше методов запроса. Примечание: Красноречивый Строитель расширяет Беглый Query Builder для выполнения своей задачи.
User::find(1)
: Этот оператор немедленно возвращает экземпляр модели записи, в которой находится первичный ключ. 1 Примечание: Это вернет красноречивую коллекцию, если несколько идентификаторов будут переданы в найти метод напримерfind([1,2,3]
Итак, первый запрос с куда метод возвращает экземпляр построителя запросов, что означает, что мы можем добавить больше методов построителя запросов по мере продвижения, а также свободный запрос, когда вызываемый метод не существует в классе красноречивого построителя, например: join
метод.
Во втором запросе мы можем добавить методы как модели, так и построителя запросов.
Примечание: Некоторые методы существуют как в классе Builder, так и в классе Model.
Итак, как вы можете себе представить, если у вас есть экземпляр модели, первая точка отсчета метода будет из Модель класс, и если он не будет найден, будет найден из Конструктор запросов. Более или менее похоже на переопределение метода в случае наследования. Но в данном случае волшебный метод __вызов используется для этой проверки #L1602.
И один из таких методов, существующих как в Строитель а также Модель это метод обновления.
Есть несколько отличий в реализации этих обновлений от того, что в Модель возвращает false, если модель не существует, а также позволяет пользователю передавать параметры, например, устанавливать ли временную метку или нет.
Хотя почему это стоит отметить?
Не то чтобы вы хотели это сделать, но скажите, что по какой-то причине вы переопределяете метод обновления в модели. Ну, это означает, что пока у вас есть Модель например, как в нашем примере выше User::find(1)->update([...]
ваш переопределенный метод будет выполнен.
Но в этом случае используется другой тип запроса, где Строитель возвращается, ваш метод не будет запускаться как обновление по умолчанию в Строитель будет вызываться вместо этого.
Но, надеюсь, вам не придется переопределять какие-либо методы, а нужно найти другие более чистые способы обработки ситуаций, которые могут возникнуть.
Что я надеюсь пролить свет на этот пост, так это полезность понимания того, как все работает и как это может пригодиться в один прекрасный день.
использованная литература
Осветить\база данных\красноречивый | Ларавель API
_Редактировать описание_laravel.com