Часть 1: Главный вопрос
На моем colours_tab
таблица (PostgreSQL 9.6), у меня есть столбец с именем colours_json_col
типа JSONB.
У меня есть следующий код в моем контроллере Laravel, который создает новую запись в вышеупомянутой таблице:
$colour_rec = new ColoursModel();
$colour_rec -> colours_json_col = ['fruits' => ['apple' => 'pink'] ];
$colour_rec -> update (['colours_json_col->fruits->apple' => 'green']);
$colour_rec -> saveOrFail();
Приведенный выше код не выдает ошибку и не создает исключение, однако после его выполнения новая запись в моей базе данных содержит следующие данные JSON:
{"fruits": {"apple": "pink"}}
Очевидно, что я хочу, чтобы яблоко было зеленым, а не розовым! Документация здесь (https://laravel.com/docs/5.5/queries#updates) предполагает, что я делаю правильные вещи, чтобы установить «зеленый». Кто-нибудь может увидеть, что я делаю не так?
Часть 2: Бонусный вопрос
Чтобы не допустить ошибок в приведенном выше коде, я должен был объявить столбец colours_json_col
как $fillable
в модели:
protected $fillable = ['colours_json_col'];
Я не хочу устанавливать столбец как $fillable
если вообще возможно. Таким образом, есть ли способ обновить значение, не вызывая update()
функционировать?
Отвечая на обе части вопроса в одном:
$colour_rec = new ColoursModel();
$colour_rec -> colours_json_col = ['fruits' => ['apple' => 'pink'] ];
$colour_rec -> setAttribute ('colours_json_col->fruits->apple', 'green');
$colour_rec -> saveOrFail();
Насколько я могу судить, в Eloquent это недокументированная функция.
Других решений пока нет …