Size: a a a

2020 April 16

EG

Egor Gruzdev in Laravel Pro
Kushina Uzumaki
Может вы конечно видите там то, чего не вижу я
данный способ работы с полями json это всего лишь "синтактический" сахар, в реальности вы можете выполнить этот запрос и посмотреть что будет использовано в Mysql или Postgress в реальном запросе, скорее всего это будет что-то вроде: https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
также вам не кто не запрещает использовать raw запрос из приведённых в документации MySql
источник

EG

Egor Gruzdev in Laravel Pro
также вот статья с примерами: https://nullthoughts.com/development/2019/01/29/laravel-json-column-types/
источник

EG

Egor Gruzdev in Laravel Pro
Попробуйте, лично мне не приходилось использовать данный механизм, я использовал raw запросы
источник

KU

Kushina Uzumaki in Laravel Pro
Egor Gruzdev
Попробуйте, лично мне не приходилось использовать данный механизм, я использовал raw запросы
Да что-то я поняла, что это пока мне не по силам. Попробую пока что использовать это добро - https://packagist.org/packages/mikemccabe/json-patch-php
источник

EG

Egor Gruzdev in Laravel Pro
Kushina Uzumaki
Да что-то я поняла, что это пока мне не по силам. Попробую пока что использовать это добро - https://packagist.org/packages/mikemccabe/json-patch-php
так это на уровне php и придется циклом пробежаться по всем выбранным строкам, чтоб сделать изменение, а потом или через update массово отправить обновление, причем всего json, а не его кусочка.
как я понял из первоначального вопроса, точнее наверное додумал, нужно было всего одно свойство поменять в диапазоне выборки базы.
источник

AB

Andrey Bogdanov in Laravel Pro
Kushina Uzumaki
Какой-то бесполезный бред, если честно. Если параметры у этого json поля динамические, то есть я сама заранее не могу знать, из каких параметров он состоит, то чтобы это сработало, нужно рекурсивно проходиться по всему массиву, в котором тоже встретятся массивы и по одному параметру менять каждый параметр...
Проще mongo db использовать, если структура json имеет большую вложенность, если одно поле в json надо обновить то можно так,
$order = Order::query()->find(1);
$order->forceFill(['options->enabled'=>true])->save()

Если добавлять новые, то только присвоить options в промежуточную переменную и мержануть массивы рекурсивно со старыми значениями + новые
источник

EG

Egor Gruzdev in Laravel Pro
Andrey Bogdanov
Проще mongo db использовать, если структура json имеет большую вложенность, если одно поле в json надо обновить то можно так,
$order = Order::query()->find(1);
$order->forceFill(['options->enabled'=>true])->save()

Если добавлять новые, то только присвоить options в промежуточную переменную и мержануть массивы рекурсивно со старыми значениями + новые
с mongo DB приходилось работать?
я так понимаю кроме Doctrine ODM ничего толком нету?
источник

AB

Andrey Bogdanov in Laravel Pro
Да приходилось, там все несложно, есть пакет https://github.com/jenssegers/laravel-mongodb
Вся настройка в том что создается папка с моделями монги и модель наследуется не от Eloquent а от Mongo Eloquent
источник

BL

Boris Lepikhin in Laravel Pro
Kushina Uzumaki
Ознакомилась. Ничего кроме одного примера с изменением одного параметра я там не увидела
Можно изменять несколько вложенных параметров сразу:
$model->update([
 'meta->a->b' => 10,
 'meta->a->c' => 5,
]);

Можно попробовать замаппить так
collect(Arr::dot($data))->mapWithKeys(function ($value, $key) {
 return [str_replace('.', '->', $key) => $value];
})->toArray();
источник

BL

Boris Lepikhin in Laravel Pro
источник

KU

Kushina Uzumaki in Laravel Pro
Boris Lepikhin
Можно изменять несколько вложенных параметров сразу:
$model->update([
 'meta->a->b' => 10,
 'meta->a->c' => 5,
]);

Можно попробовать замаппить так
collect(Arr::dot($data))->mapWithKeys(function ($value, $key) {
 return [str_replace('.', '->', $key) => $value];
})->toArray();
Спасибо, чуть позже попробую)
источник

KU

Kushina Uzumaki in Laravel Pro
Boris Lepikhin
Можно изменять несколько вложенных параметров сразу:
$model->update([
 'meta->a->b' => 10,
 'meta->a->c' => 5,
]);

Можно попробовать замаппить так
collect(Arr::dot($data))->mapWithKeys(function ($value, $key) {
 return [str_replace('.', '->', $key) => $value];
})->toArray();
Да, то что хотела прям! Спасибо большое!)
Единственная проблема, что этот способ меняет местами некоторые параметры, то, что было изначально первым, после изменения сместилось на второе место. Буду думать, как можно решить, еще раз спасибо)
источник

EG

Egor Gruzdev in Laravel Pro
Kushina Uzumaki
Да, то что хотела прям! Спасибо большое!)
Единственная проблема, что этот способ меняет местами некоторые параметры, то, что было изначально первым, после изменения сместилось на второе место. Буду думать, как можно решить, еще раз спасибо)
это база данных смещает, если у тебя поля в json типа в mysql, то порядок будет меняться
источник

KU

Kushina Uzumaki in Laravel Pro
Egor Gruzdev
это база данных смещает, если у тебя поля в json типа в mysql, то порядок будет меняться
То есть это не лечится?))
источник

EG

Egor Gruzdev in Laravel Pro
Вопрос для чего тебе иметь тот же порядок:
{
  "test2": "1",
  "test1":"2"
}

или
{
  "test1": "2",
  "test2":"1"
}

это одно и тоже
источник

KU

Kushina Uzumaki in Laravel Pro
Egor Gruzdev
Вопрос для чего тебе иметь тот же порядок:
{
  "test2": "1",
  "test1":"2"
}

или
{
  "test1": "2",
  "test2":"1"
}

это одно и тоже
Участвую в одном мероприятии, конкурс если это так можно назвать. Там в примерах ответ от сервера выдает в таком же порядке, как было. Вот и боюсь, что придерутся)
источник

KU

Kushina Uzumaki in Laravel Pro
По идее, если я изменю тип на какой-нибудь longText я не потеряю json. Надо попробовать)
источник

KU

Kushina Uzumaki in Laravel Pro
Нет, теперь вообще стер этот параметр 😅
источник

EG

Egor Gruzdev in Laravel Pro
да но при этом ты потеряешь преимущества, о которых тебе писали выше, т.е. работать с json ты должна будешь на стороне php, а базе данных все будет лежать как есть.
источник

EG

Egor Gruzdev in Laravel Pro
Kushina Uzumaki
Участвую в одном мероприятии, конкурс если это так можно назвать. Там в примерах ответ от сервера выдает в таком же порядке, как было. Вот и боюсь, что придерутся)
мне кажется не стоит на это акцент делать, все будет супер
источник