Laravel-可选的JsonConatins在哪里和哪里无法正常工作

时间:2018-12-28 09:31:21

标签: php laravel eloquent

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和可选wheres?

注意:可能有助于正确解决问题

您还可以逆转情况

 $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 :(得分:1)

更改后尝试:

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 |
+---------+---------+

我不知道它是否可以在您的情况下使用。但如果是,则对表进行规范化

答案 1 :(得分:0)

只要尝试这个

$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);