Есть ли нормальный способ получить все поля модели Eloquent, без чтения из базы?

В Laravel, существует несколько способов получить все поля модели Eloquent без чтения из базы данных. Рассмотрим каждый из них.

1. Метод getFillable():

Модели Eloquent в Laravel имеют метод getFillable(), который возвращает массив полей, которые разрешено массово назначать (mass-assignable fields) при использовании метода create() или fill(). Этот метод вернет только те поля, которые настроены в модели с помощью свойства $fillable. Чтобы получить все поля модели, вы можете использовать следующий код:

$model = new YourModel();
$fields = $model->getFillable();

2. Свойство $attributes:

У каждой модели Eloquent есть свойство $attributes, которое представляет собой ассоциативный массив, содержащий все текущие значения полей модели. Вы можете получить все эти поля следующим образом:

$model = YourModel::find($id);
$fields = $model->getAttributes();

3. Метод getOriginal():

Метод getOriginal() возвращает оригинальные значения полей модели перед их изменением. Если модель не позволяет массовое назначение полей, этот метод вернет все поля модели. Пример использования:

$model = YourModel::find($id);
$fields = $model->getOriginal();

4. Метод getAttributes():

Метод getAttributes() возвращает все значения полей модели включая связанные модели (relationships). Этот метод также будет возвращать полный список полей модели. Пример использования:

$model = YourModel::find($id);
$fields = $model->getAttributes();

5. Рефлексия класса:

Если вы хотите получить список всех полей модели, включая все значения, включая защищенные (protected) и скрытые (hidden), вы можете использовать рефлексию класса. Ниже приведен пример кода, демонстрирующий этот подход:

$model = new YourModel();
$reflect = new ReflectionClass($model);
$properties = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
$fields = [];

foreach ($properties as $property) {
    $fields[] = $property->getName();
}

// Добавляем скрытые поля
$fields = array_merge($fields, $model->getHidden());

// Добавляем защищенные поля
$fields = array_merge($fields, array_keys($model->getArrayableItems($model->getGuarded())));

Вы можете использовать любой из вышеуказанных методов для получения всех полей модели без чтения из базы данных в Laravel. Выбор способа зависит от конкретных требований и настроек вашего проекта.