Laravel eloquent update JSON столбец некоторых полей без переопределения всего остального - PullRequest
0 голосов
/ 06 апреля 2020

Мы пытаемся использовать JSON типы данных для хранения Profile динамических c данных и не знаем всех жестко закодированных имен полей, добавляемых в свойство fillable в модель. как установить (insert если ключ не существует | update, если ключ существует) только один ключ, а не все?

Например, если мы хотим обновить только age, и мы используем :

$model = Profile::find($profile_id);
$model->options = json_encode(['age' => '21']);
$model->save();

это решение не является хорошим вариантом, потому что оно перекрывает все остальное. Как мы можем установить только нужные поля без изменения других полей (клавиши JSON)?

1 Ответ

0 голосов
/ 06 апреля 2020

решение в чистом виде mysql:

UPDATE `profiles`
SET `data` = JSON_SET(
    `data` ,
    '$.age' ,
    '21'
)
WHERE
    `id` = 1;

Функция JSON_SET добавит свойство, если оно не найдено, иначе замените его. подробнее здесь

Но в Laravel вы должны установить атрибут Model $guarded и удалить $fillable (или оставить его пустым), и тогда все будет fillable кроме guarded.

, тогда вы можете использовать:

Profile::find($profile_id)->update([
   'data->age' => 21,
   'data->gender' => 'male',
]);

здесь есть хорошие впечатления

Вы также можете использовать следующий код как упоминалось @ Джонас Штауденмейр :

DB::table('...') with Profile::query()

https://laravel.com/docs/7.x/queries#updating - json -колонки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...