Laravel - Необязательно, где и где JsonConatins работает неправильно - PullRequest
0 голосов
/ 28 декабря 2018

PHP 7.2.10

Laravel 5.6.39

  $statuses = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
    $notStatuses = [14, 15, 16, 17, 18, 19];

    $videos = Video::query();

    if ( isset( $queryParams['category'] ) ){
        $videos = $videos->where('video_category', '=', $queryParams['category']);
    }
    if ( isset( $queryParams['language'] ) ){
        $videos = $videos->where('video_language', '=', $queryParams['language']);  
    }

    $videos = $videos->where(function($query) use($statuses) {
        foreach($statuses as $status) {
            $query->orWhereJsonContains('video_status_ids', $status);
        }
    });

    $videos = $videos->where(function($query) use($notStatuses) {
        foreach($notStatuses as $status) {
            $query->whereJsonDoesntContain('video_status_ids', $status);
        }
    });


    $videos = $videos->orderBy('video_priority', 'desc')->latest()->paginate(10);

    return $videos;

Язык и категория являются дополнительными фильтрами в текущем состоянии, давайте рассмотрим языковой фильтр, если нет видео с выбранным языком,даже тогда я получу видео со статусами 10 и 11,

, если я буду использовать whereJsonContains над фильтрами, то это также даст неверный результат, как мне следует использовать whereJsonContains, whereJsonDoesNotContains и дополнительные источники, где правильно?

Примечание: может быть полезно для правильного решения проблемы

Вы также можете изменить ситуацию

 $statuses = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
 $notStatuses = [14, 15, 16, 17, 18, 19];

под изображением, показывающим видео на хинди с ручными тегами, ноВидно, что выбранные фильтры - авто-теггер и индонезийский.

enter image description here

Запрос, сгенерированный для

http://mysite.dev/admin/tagging-in-progress?_token=d4jQOLDixYSEXhMR2z8OihVPQ2ZKTezJhk3tIWJg&category=manual_tagger&language=maltese&video_status=&submit=

, равен

select * from `videos` where `video_category` = 'manual_tagger' and `video_language` = 'english' and json_contains(`video_status_ids`, 9) or json_contains(`video_status_ids`, 29)  order by `video_priority` desc, `created_at` desc limit 10 offset 0  

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

просто попробуйте это

$video = $videos->where(function($query) use($statuses) {
        foreach($statuses as $status) {
            $query->orWhereJsonContains('video_status_ids', $status);
        }
    })->where(function($query) use($notStatuses) {
        foreach($notStatuses as $status) {
            $query->whereJsonDoesntContain('video_status_ids', $status);
        }
    })
->orderBy('video_priority', 'desc')->latest()->paginate(10);
0 голосов
/ 28 декабря 2018

попробуйте после изменения:

WhereJsonContains('video_status_ids', $status)

до

whereRaw('JSON_CONTAINS(video_status_ids, "$status")')

Но, Лучший способ - нормализовать структуру БД.

Пример:

опубликовать в виде таблицы:

+---------+---------+
| user_id | post_id |
+---------+---------+
|       1 |     1,2 |
|       2 |     1,5 |
+---------+---------+

нормализовать табель

+---------+---------+
| user_id | post_id |
+---------+---------+
|       1 |       1 |
|       1 |       2 |
|       2 |       1 |
|       2 |       5 |
+---------+---------+

Я не знаю, можно ли его использовать в вашем состоянии илине.но если это так, то нормализуй таблицу

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