@hesy

Как выполнить поиск по множественному многомерному JSON полю в Eloquent Laravel?

Миграция
Schema::create('examples', function (Blueprint $table) {
    ...
    $table->json('cars');
    ...
});


Содержимое поля 'cars'
[
   {
      "name":"Sport",
      "list":[
         {
            "id":1,
            "name":"example"
         },
         {
            "id":2,
            "name":"example"
         },
         {
            "id":3,
            "name":"example"
         }
      ]
   },
   {
      "name":"Jeep",
      "list":[
         {
            "id":4,
            "name":"example"
         },
         {
            "id":5,
            "name":"example"
         },
         {
            "id":6,
            "name":"example"
         }
      ]
   }
]


Как выполнить поиск по полю cars, и выбрать все записи, где id = N? База mysql.

$carIds= [1, 3, 5];

// вот так работает, но только если id передать как int, с массивом $carsIds уже не работает :/
Example::whereJsonContains('cars', ['list' => ['id' => 1]])->get()

Example::whereJsonContains('cars', $carIds)->get();

// пробовал хотя бы просто найти по первому элементу 
Example::whereJsonContains('cars->0->list->0->id', $carIds)->get();

// это тоже не получилось
Example::whereJsonContains('cars->*->list->*->id', $carIds)->get();
  • Вопрос задан
  • 632 просмотра
Пригласить эксперта
Ответы на вопрос 2
Alex_Wells
@Alex_Wells
PHP/Kotlin
Нормально - никак. И судя по примеру, тебе нужно переделать структуру таблиц.
Ответ написан
Комментировать
@hesy Автор вопроса
В общем решил вопрос следующим образом:

$carsIds = [1, 2, 5];

$example = Example::query();

foreach ($carsIds as $carId) {
    $example->whereJsonContains('cars', ['list' => ['id' => $carId]]);
}

$examples = $example->take(12)->get();


Так же можно использовать orWhereJsonContains если нужно.

Цикл, потому что с массивом не работает, хотя может я неправильно делаю.
Example::whereJsonContains('cars', ['list' => ['id' => $carIds]])->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы