Функции утилит в целом предлагают какую-то утилиту, то есть функциональность, которая обычно предназначена только для удобства, а также может быть достигнута, выполнив ряд шагов.
Например, Model::find()
- это функциональность, которая также может быть достигнута путем создания объекта построителя запросов и последующего выполнения запроса, например,
Model::getQuery()->where('id', '=', $id)->first();
Для удобства вы можете просто сделать Model::find($id)
, который короче и более интуитивно понятен.
Это статично, потому что не имеет смысла не быть статичным. Нестатический метод требует экземпляра класса, однако в ORM экземпляр класса соответствует потенциальной записи в базе данных (которая либо существует, либо может существовать).
Поэтому, поскольку find
используется для извлечения записи из базы данных, нет смысла требовать наличия резервной записи в базе данных для ее использования.
Короче говоря, это означает, что если вы выполните метод $object = Model::find(1)
, вы получите модель, соответствующую записи в базе данных с идентификатором 1
. Существует соотношение 1: 1 объекта PHP к реляционному объекту. Если внести изменения в $object
и вызвать $object->save()
, то изменения будут сохранены в базе данных (т.е. $object
уже существует). Если, с другой стороны, вы введете $object = new Model()
, вы получите новую модель, которая в настоящее время не соответствует записи в базе данных. Однако, вызов $object->save()
сделает этот объект соответствующим новой записи в базе данных, и он будет соответствующим образом обновлен (то есть новый объект может существовать). Если фреймворк требовал от вас создания «фиктивного» объекта просто для доступа к некоторым вспомогательным методам, всегда есть вероятность, что (либо из-за пропуска, либо из-за неизвестных побочных эффектов) save()
вызовут этот фиктивный объект, и вы в конечном итоге заполните свой База данных с тем, что по сути мусор.
Вывод из этого заключается в том, что в ORM не имеет смысла создавать экземпляр модели, если вы не собираетесь хранить его в базе данных. Laravel не строго соблюдает это правило, но в целом он соблюдается, и вы тоже должны.
То же самое относится к all
, который получает все записи базы данных. Не имеет смысла получать все записи базы данных, требуя сначала получить одну запись.
То же самое относится к getQuery
, используемому выше, который возвращает экземпляр построителя запросов. Обратите внимание, что большинство людей на самом деле не используют getQuery
, потому что оно работает неявно, когда кто-то использует что-то вроде, например. Model::where(..)
технически Model::where()
тоже утилита. Я упоминаю об этом, потому что когда вы видите что-то вроде Model::where('id', $id)->where('name', $name)
, 2-й, где находится после ->
, что подразумевает, что это экземпляр, а не статический, однако этот экземпляр на самом деле является экземпляром построителя запросов, а не экземпляром модели.