Метод Laravel Model Create возвращает экземпляр модели неполных полей

У меня возникла проблема с получением данных моей модели после вставки. Ниже приведен пример кода, в котором Модель пользователя уже имеет свой $fillable, содержащий все необходимые атрибуты (атрибуты id и state как дополнения к приведенным ниже).

$values = ['firstname' => 'Nick', 'lastname' => 'King', 'gender' => 'male' ];
$createdUser = User::create( $values );

Вот код миграции:

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('firstname', 60);
        $table->string('lastname', 60);
        $table->string('gender', 6);
        $table->string('state', 20)->default('inactive');
        $table->timestamps();
    });

При отправке $createdUser как JSON я заметил, что атрибут state не существует. Он существует в миграции имеющий значение по умолчанию, а также в модели $fillable, но не в атрибуте $hidden. Так что не так?

Это ошибка для отсутствие полей со значениями по умолчанию в возвращаемой модели или это просто способ работы Laravel.

Вы можете поделиться своей реальной моделью?

Sheng Slogar 16.11.2018 17:18

Ах, похоже, вот как работает Laravel. Просто снова войдите в базу данных с запросом. Подумайте, например, если бы у вас было автоматически увеличивающееся значение. Только база данных может отслеживать это - Laravel не может - поэтому вам придется дважды обратиться к базе данных, один для вставки, один для этого столбца. С ::create Laravel знает только столбцы, которые вы явно определяете в $values.

Sheng Slogar 16.11.2018 17:20

Я думаю, что это обычно проблема только при создании записи для API, где данные возвращаются как JSON. Пара подходов будет: 1) снова попасть в базу данных после ::create(), чтобы синхронизировать $createdUser с его аналогом в БД, или 2) в вашем приложении связать вызов после вашего вызова create с чем-то вроде getUser(), чтобы вы извлекали пользователя из базы данных.

Tim Lewis 16.11.2018 17:25
$createdUser()->fresh() обновит модель последними значениями из базы данных. Это должно включать значения по умолчанию для статуса.
Peter 16.11.2018 17:47

Пожалуйста, предоставьте вашу модель, а также вашу миграцию.

Kenny Horna 16.11.2018 17:50

@ShengSlogar, я кое-что не понимаю. Если Laravel не может это отследить, как он может вернуть автоматически увеличиваемое поле идентификатора в модель?

Cfass King 16.11.2018 20:35

Вопрос отредактирован для код миграции согласно вашему запросу @HCK

Cfass King 16.11.2018 20:47

Кстати @Peter, твоя идея работает, но хм! Разве это не здорово. Использование метода ->fresh() добавит еще один запрос SQL к другим. В итоге я добавил в запрос поле state со значением по умолчанию. Вам не кажется, что так будет лучше сократить количество запросов?

Cfass King 16.11.2018 21:05

Хорошо, если посмотреть немного глубже, вы сможете установить значение по умолчанию для вашей модели User, включив: protected $attributes = ['state' => 'inactive']; ... это должно дать вам значение по умолчанию, не обращаясь к БД дополнительное время.

Peter 17.11.2018 02:01

Привет, @Peter! Ваш обходной путь помог. Спасибо! Можете ли вы опубликовать ответ, чтобы я мог отметить его как решение?

Cfass King 19.11.2018 12:38

@CfassKing Рад, что у вас сработало. Я вложил информацию в ответ, как вы предложили.

Peter 19.11.2018 14:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
11
1 299
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поле перечисления должно иметь предопределенные значения:

$table->enum(‘state’, [‘active’, ‘inactive’])->default(‘inactive’);

Я бы также сохранил пол таким же образом.

Вопрос уже редактировался. Это было у меня плохо. Поле state здесь имеет строковый тип. Спасибо.

Cfass King 19.11.2018 14:46

Я знаю, но вы должны сохранить его как enum. Почему вы храните его как строку?

Zoli 19.11.2018 14:51

Фактически, я использую перечислить, но только для этого поста, чтобы упростить его, я решил сделать это таким образом.

Cfass King 19.11.2018 17:21
Ответ принят как подходящий

Другой способ указать значения по умолчанию для ваших моделей - добавить свойство $attributes в классы Model:

protected $attributes = ['state' => 'inactive'];

Это должно установить значения по умолчанию для экземпляра Model при создании новой модели без повторного обращения к базе данных после ее создания для получения значений по умолчанию.

Другие вопросы по теме