У меня возникла проблема с получением данных моей модели после вставки. Ниже приведен пример кода, в котором Модель пользователя уже имеет свой $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.
Ах, похоже, вот как работает Laravel. Просто снова войдите в базу данных с запросом. Подумайте, например, если бы у вас было автоматически увеличивающееся значение. Только база данных может отслеживать это - Laravel не может - поэтому вам придется дважды обратиться к базе данных, один для вставки, один для этого столбца. С ::create Laravel знает только столбцы, которые вы явно определяете в $values.
Я думаю, что это обычно проблема только при создании записи для API, где данные возвращаются как JSON. Пара подходов будет: 1) снова попасть в базу данных после ::create(), чтобы синхронизировать $createdUser с его аналогом в БД, или 2) в вашем приложении связать вызов после вашего вызова create с чем-то вроде getUser(), чтобы вы извлекали пользователя из базы данных.
$createdUser()->fresh() обновит модель последними значениями из базы данных. Это должно включать значения по умолчанию для статуса.
Пожалуйста, предоставьте вашу модель, а также вашу миграцию.
@ShengSlogar, я кое-что не понимаю. Если Laravel не может это отследить, как он может вернуть автоматически увеличиваемое поле идентификатора в модель?
Вопрос отредактирован для код миграции согласно вашему запросу @HCK
Кстати @Peter, твоя идея работает, но хм! Разве это не здорово. Использование метода ->fresh() добавит еще один запрос SQL к другим. В итоге я добавил в запрос поле state со значением по умолчанию. Вам не кажется, что так будет лучше сократить количество запросов?
Хорошо, если посмотреть немного глубже, вы сможете установить значение по умолчанию для вашей модели User, включив: protected $attributes = ['state' => 'inactive']; ... это должно дать вам значение по умолчанию, не обращаясь к БД дополнительное время.
Привет, @Peter! Ваш обходной путь помог. Спасибо! Можете ли вы опубликовать ответ, чтобы я мог отметить его как решение?
@CfassKing Рад, что у вас сработало. Я вложил информацию в ответ, как вы предложили.






Поле перечисления должно иметь предопределенные значения:
$table->enum(‘state’, [‘active’, ‘inactive’])->default(‘inactive’);
Я бы также сохранил пол таким же образом.
Вопрос уже редактировался. Это было у меня плохо. Поле state здесь имеет строковый тип. Спасибо.
Я знаю, но вы должны сохранить его как enum. Почему вы храните его как строку?
Фактически, я использую перечислить, но только для этого поста, чтобы упростить его, я решил сделать это таким образом.
Другой способ указать значения по умолчанию для ваших моделей - добавить свойство $attributes в классы Model:
protected $attributes = ['state' => 'inactive'];
Это должно установить значения по умолчанию для экземпляра Model при создании новой модели без повторного обращения к базе данных после ее создания для получения значений по умолчанию.
Вы можете поделиться своей реальной моделью?