Поля в моделях Laravel Eloquent

Я новичок в Laravel и Eloquent, поэтому извините меня, если это совершенно глупый вопрос. Я смотрел на то, как создать модель в обоих документации здесь, а также еще один учебник здесь (в разделе Создание моделей с использованием секции Eloquent ОРМ), и я заметил, что фактические поля таблицы никогда не упоминаются, если не что - то (например, иметь отношения с другой таблицей или не требовать массового присвоения, или если они должны быть скрыты от выхода JSON и т.д.),

Являются ли эти поля опущены специально, а PHP просто добавляет их, когда он выполняет запрос с использованием PDO с FETCH_OBJ? Если да, то почему мы явно не помещаем поля в модель? Разве это не помогает нам узнать, какие поля у нас есть, а также IDE, такие как PHPStorm, чтобы открыть правильные поля автозаполнения?

Если они действительно необходимы, какой уровень доступа им нужен?

Благодарю.

Ответ 1

Имена столбцов (поля) не требуются в моделях "Красноречивый". Как вы указали, необходимо только определить функции, которые определяют отношения, которые модель имеет с другими.

Нет необходимости включать их по причине, о которой вы упомянули (Laravel делает select * а затем добавляет все возвращенные строки объекту модели как общедоступные свойства). Это процесс, называемый гидратацией, и вы можете точно видеть, что происходит, врываясь в источник Laravel. Вот краткое изложение того, что происходит:

  1. Вы вызываете (например), Users::find(123);
  2. Illuminate\Database\Eloquent\Model::find() Illuminate\Database\Eloquent\Builder::find()
  3. find() SELECT * FROM users WHERE id = 123 запрос SELECT * FROM users WHERE id = 123 и затем возвращает первый результат, вызывая Illuminate\Database\Eloquent\Builder::first()
  4. first() добавляет LIMIT 1, вызывая Illuminate\Database\Query\Builder::take()
  5. Затем first() устанавливает возвращаемые столбцы (* по умолчанию), вызывая Illuminate\Database\Eloquent\Builder::get().
  6. get() возвращает Illuminate\Database\Eloquent\Collection, используя возвращаемое значение Illuminate\Database\Eloquent\Builder::getModels()
  7. getModels() фактически выполняет запрос, а затем вызывает Illuminate\Database\Eloquent\Model::newFromBuilder() для каждой возвращаемой строки
  8. newFromBuilder() создает новый экземпляр модели и устанавливает столбцы (поля), вызывая Illuminate\Database\Eloquent\Model::setRawAttributes()

Я пропустил некоторые несвязанные вещи, такие как нетерпевая загрузка, чтобы упростить процесс, но это в основном то, что происходит для каждого запроса.

Вы хорошо понимаете, что знание полей заранее может быть полезно для автозаполнения. Из-за природы setRawAttributes() вполне нормально объявлять все имена столбцов (поля) в вашей модели (просто убедитесь, что они общедоступны). Однако конвенция (и для вас здравомыслие) заключается в том, чтобы опустить их. Такие декларации следует оставить в файлах миграции.

После дальнейшего изучения источника, это не нормально объявлять поля заранее. Это связано с тем, что фактические значения атрибутов хранятся в свойстве $attributes а затем доступны магическим методом __get(). Проблема заключается в том, что, предварительно определив свойства, вы запретите __get() при доступе к полям. Поэтому это не вариант.

Тем не менее, есть способы намекнуть редакторам (например, PhpStorm) о существовании свойств без явного определения их.

Ответ 2

Есть еще один способ заставить phpstorm автоматически заполнить имя столбца и избежать предупреждения.

/**
 * @property string $title Title of article
 */
class Article extends Eloquent