Laravel updateOrCreate игнорирует некоторые поля

#laravel #eloquent #laravel-8

#laravel #красноречивый #laravel-8

Вопрос:

Я уже несколько часов дергаю себя за волосы, пытаясь найти проблему с этими строками кода:

     ContentSetting::updateOrCreate(
        ['content_id' => $this->id, 'key' => 'max_width'],
        ['value' => $value]
    );
  

Предполагается проверить, есть ли в моей таблице content_settings строка с определенным идентификатором содержимого и ключом «max_width», и если да, обновите ее, а если нет, создайте ее. Он используется в модельном мутаторе, отсюда и $this .

В любом случае, независимо от того, какие значения я пытаюсь ввести, это ВСЕГДА приводит к выполнению этого запроса mysql (только с разными временными метками):

 insert into `content_settings` (`content_id`, `updated_at`, `created_at`) values (2, '2020-10-15 14:07:00', '2020-10-15 14:07:00')
  

…просто создание новых строк с пустым ключом и значением. Может кто-нибудь, пожалуйста, определить ошибку? Или это где-то ошибка? Что-то с «ключом», являющимся зарезервированным словом?

Комментарии:

1. как насчет $fillable в вашей модели настройки содержимого? содержит ли он ключ и значение?

2. Дох! Я ЗНАЛ, что это будет что-то совершенно очевидное. Конечно! Большое спасибо!

3. Пожалуйста, я добавлю свой ответ, чтобы мы могли закрыть этот вопрос

Ответ №1:

вы должны установить поля, которые вы хотите использовать при массовом присвоении, в массиве $fillable в вашей модели:

 class ContentSetting extends Model
{
  protected $fillable = ['content_id','key','value'];
}
  

Комментарии:

1. Просто для записи: было бы неплохо, если бы Laravel каким-то образом сигнализировал об этом. Это сэкономило бы мне час или два…