Eloquent, PostgreSQL JSONB и вложенные массивы - PullRequest
0 голосов
/ 15 октября 2019

У меня проблемы с поиском вложенного массива JSON в приложении Laravel 6 с PostgreSQL в качестве БД.

Миграция:

$table->bigIncrement('id');
$table->string('comment')->nullable();
$table->jsonb('result')->nullable()

Модель:

protected $casts = [
    'result' => 'json'
];

JSONпример:

{
  "suggestions": [
    {
      "value": "short value",
      "unrestricted_value": "full lenght value",
      "data": {
        "postal_code": "",
        "country": "",
        "country_iso_code": "RU",
        ...
        other fields
        ...
        "qc": null
      }
    }
  ]
}

Мне нужно запросить JSON по коду страны.

Команды, которые я пробовал:

>>> Model::where('result->suggestions->0->data->country_iso_code', 'RU')->first()
=> null
>>> Model::where('result->suggestions->data->country_iso_code', 'RU')->first()
=> null
>>> Model::where('result->suggestions.data->country_iso_code', 'RU')->first()
=> null
>>> Model::where('result->suggestions->data->country_iso_code', 'RU')->first()
=> null
>>> Model::whereJsonContains('result->suggestions', ['data->country_iso_code' => 'RU'])->first()
=> null
>>> Model::whereJsonContains('result', ['suggestions' => ['data->country_iso_code' => 'RU']])->first()
=> null

Мне нужна помощь, я застрял. Заранее спасибо.

Примечание: я не могу изменить таблицу базы данных и способ хранения данных, поскольку данные передаются другим приложениям.

PS: извините за плохой английский, это не такмой родной язык

1 Ответ

0 голосов
/ 15 октября 2019

Я должен использовать режим массива для поиска

Model::whereJsonContains('result', ['suggestions' => [0 => ['data' => ['country_iso_code' => 'RU']]]])->first()

возвращает ожидаемые данные

...