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];
под изображением, показывающим видео на хинди с ручными тегами, ноВидно, что выбранные фильтры - авто-теггер и индонезийский.
Запрос, сгенерированный для
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