Ответ 1
Имена столбцов (поля) не требуются в моделях "Красноречивый". Как вы указали, необходимо только определить функции, которые определяют отношения, которые модель имеет с другими.
Нет необходимости включать их по причине, о которой вы упомянули (Laravel делает select *
а затем добавляет все возвращенные строки объекту модели как общедоступные свойства). Это процесс, называемый гидратацией, и вы можете точно видеть, что происходит, врываясь в источник Laravel. Вот краткое изложение того, что происходит:
- Вы вызываете (например),
Users::find(123);
-
Illuminate\Database\Eloquent\Model::find()
Illuminate\Database\Eloquent\Builder::find()
-
find()
SELECT * FROM users WHERE id = 123
запросSELECT * FROM users WHERE id = 123
и затем возвращает первый результат, вызываяIlluminate\Database\Eloquent\Builder::first()
-
first()
добавляетLIMIT 1
, вызываяIlluminate\Database\Query\Builder::take()
- Затем
first()
устанавливает возвращаемые столбцы (*
по умолчанию), вызываяIlluminate\Database\Eloquent\Builder::get()
. -
get()
возвращаетIlluminate\Database\Eloquent\Collection
, используя возвращаемое значениеIlluminate\Database\Eloquent\Builder::getModels()
-
getModels()
фактически выполняет запрос, а затем вызываетIlluminate\Database\Eloquent\Model::newFromBuilder()
для каждой возвращаемой строки -
newFromBuilder()
создает новый экземпляр модели и устанавливает столбцы (поля), вызываяIlluminate\Database\Eloquent\Model::setRawAttributes()
Я пропустил некоторые несвязанные вещи, такие как нетерпевая загрузка, чтобы упростить процесс, но это в основном то, что происходит для каждого запроса.
Вы хорошо понимаете, что знание полей заранее может быть полезно для автозаполнения. Из-за природы setRawAttributes()
вполне нормально объявлять все имена столбцов (поля) в вашей модели (просто убедитесь, что они общедоступны).Однако конвенция (и для вас здравомыслие) заключается в том, чтобы опустить их. Такие декларации следует оставить в файлах миграции.
После дальнейшего изучения источника, это не нормально объявлять поля заранее. Это связано с тем, что фактические значения атрибутов хранятся в свойстве $attributes
а затем доступны магическим методом __get()
. Проблема заключается в том, что, предварительно определив свойства, вы запретите __get()
при доступе к полям. Поэтому это не вариант.
Тем не менее, есть способы намекнуть редакторам (например, PhpStorm) о существовании свойств без явного определения их.