Laravel где JsonContains получение записей с помощью jsonContains и не содержит - PullRequest
0 голосов
/ 22 апреля 2019

Пример данных:

13 => {#531 ▼
        +"id": 956
        +"user_type": "App\User"
        +"user_id": 35
        +"event": "updated"
        +"auditable_type": "App\Video"
        +"auditable_id": 136
        +"old_values": "{"video_status_ids":"[4, 16]"}"
        +"new_values": "{"video_status_ids":"[5,16]"}"
        +"url": "http://example.com?vhjb6gsyyas"
        +"ip_address": "106.51.36.44"
        +"user_agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
        +"tags": null
        +"created_at": "2019-01-14 11:53:09"
        +"updated_at": "2019-01-14 11:53:09"
      }

Код:

 $audits = DB::table('audits')->where('auditable_type', 'LIKE', 'App%Video')->where('new_values', 'LIKE', '{"video_status_ids":"%')->where(function($query) {
        $query->whereJsonDoesntContain('old_values->video_status_ids', '4')
            ->WhereJsonDoesntContain('new_values->video_status_ids', '5');
    })->paginate(200);

SQL-запрос, зарегистрированный в файле журнала:

array (
    'query' => 'select * from `audits` where `auditable_type` LIKE 'App%Video' and `new_values` LIKE '{"video_status_ids":"%'and (not json_contains(`old_values`->\'$."video_status_ids"\', '"[1]"') and not json_contains(`new_values`->\'$."video_status_ids"\', '"[2]"')) and (not json_contains(`old_values`->\'$."video_status_ids"\', '4') or not json_contains(`new_values`->\'$."video_status_ids"\', '5') and not json_contains(`old_values`->\'$."video_status_ids"\', '7') or not json_contains(`new_values`->\'$."video_status_ids"\', '8') and not json_contains(`old_values`->\'$."video_status_ids"\', '10') or not json_contains(`new_values`->\'$."video_status_ids"\', '11') and not json_contains(`old_values`->\'$."video_status_ids"\', '13') or not json_contains(`new_values`->\'$."video_status_ids"\', '14') and not json_contains(`old_values`->\'$."video_status_ids"\', '16') or not json_contains(`new_values`->\'$."video_status_ids"\', '17')) limit 200 offset 0',
    'bindings' => 
    array (
      0 => 'App%Video',
      1 => '{"video_status_ids":"%',
      2 => '"[1]"',
      3 => '"[2]"',
      4 => '4',
      5 => '5',
      6 => '7',
      7 => '8',
      8 => '10',
      9 => '11',
      10 => '13',
      11 => '14',
      12 => '16',
      13 => '17',
    ),

Существует комбинация комбинаций, основанная на том, какие записи я хочу получить. Как и в приведенном выше коде, я хочу записи, в которых «old_values->video_status_ids не содержит 4 и new_values->video_status_ids не содержит 5», если вместо 4-5 есть другие комбинации, такие как 4-6 или 4-7, они все равно должны получить получен.

Обновление В необработанном запросе это будет что-то вроде:

SELECT * FROM audits WHERE JSON_CONTAINS(new_values->>'$.video_status_ids', '5') AND NOT JSON_CONTAINS (old_values->>'$.video_status_ids', '4') 

Теперь я хочу это в конструкторе запросов laravel.

...