代码之家  ›  专栏  ›  技术社区  ›  Prafulla Kumar Sahu umang naik

如何正确使用where、wherejsondesntcontain和whereJsonContains的多个组合

  •  0
  • Prafulla Kumar Sahu umang naik  · 技术社区  · 7 年前

    PHP版本7.2.10 Laravel版本5.6.39

    $statuses = [4, 5, 6, 7, 14, 15, 16, 17, 18, 19];
    $notStatues = [8, 9, 10, 11, 12, 13];
    
    $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->jsonNotContains($statuses);
    
    $videos = $videos->whereJsonContains('video_status_ids', $statuses[0])
        ->orWhereJsonContains('video_status_ids',  $statuses[1])
        ->orWhereJsonContains('video_status_ids',  $statuses[2])
        ->orWhereJsonContains('video_status_ids',  $statuses[3])
        ->orWhereJsonContains('video_status_ids',  $statuses[4])
        ->orWhereJsonContains('video_status_ids',  $statuses[5])
        ->orWhereJsonContains('video_status_ids',  $statuses[6])
        ->orWhereJsonContains('video_status_ids',  $statuses[7])
        ->orWhereJsonContains('video_status_ids',  $statuses[8])
        ->orWhereJsonContains('video_status_ids',  $statuses[9]);
    
    $videos->whereJsonDoesntContain('video_status_ids', $notStatues[0])
        ->whereJsonDoesntContain('video_status_ids', $notStatues[1])
        ->whereJsonDoesntContain('video_status_ids', $notStatues[2])
        ->whereJsonDoesntContain('video_status_ids', $notStatues[3])
        ->whereJsonDoesntContain('video_status_ids', $notStatues[4])
        ->whereJsonDoesntContain('video_status_ids', $notStatues[5]);
    
    $videos = $videos->orderBy('video_priority', 'desc')->paginate(10);
    
    return $videos; 
    

    对于目前的代码,我甚至无法过滤出属于我的视频,有什么更好的方法来实现它 $notStatuses

    2 回复  |  直到 7 年前
        1
  •  3
  •   Jonas Staudenmeir    7 年前

    你必须 group OR 条款:

    $videos = $videos->where(function($query) use($statuses) {
        $query->whereJsonContains('video_status_ids', $statuses[0])
            ->orWhereJsonContains('video_status_ids', $statuses[1])
            ->orWhereJsonContains('video_status_ids', $statuses[2])
            ->orWhereJsonContains('video_status_ids', $statuses[3])
            ->orWhereJsonContains('video_status_ids', $statuses[4])
            ->orWhereJsonContains('video_status_ids', $statuses[5])
            ->orWhereJsonContains('video_status_ids', $statuses[6])
            ->orWhereJsonContains('video_status_ids', $statuses[7])
            ->orWhereJsonContains('video_status_ids', $statuses[8])
            ->orWhereJsonContains('video_status_ids', $statuses[9]);
    });
    

    或使用 foreach :

     $videos = $videos->where(function($query) use($statuses) {
         foreach($statuses as $status) {
            $query->orWhereJsonContains('video_status_ids', $status); 
        }
     }
    
        2
  •  2
  •   JsWizard    7 年前

    像这样试试。

    $statuses = array();
    
    $videos = DB::table('videos')
                    ->where('user_id', $user_id)
                    ->where(function ($query) use($statuses, $user_id) {
                      for($i = 0; $i <= 9; $i++){
                        $query->where('user_id', $user_id)
                         ->WhereJsonContains('video_status_ids', $statuses[$i]);
                        $queryResult[$i] = $query;
                      }
                    });
    
    
    $videos = $videos->orderBy('video_priority', 'desc')->paginate(10);
    
    return $videos;
    

    快乐编码~!!:)