2017-05-06 2 views
0

두 테이블 : categoriesvideos이 있는데, 피어 테이블이 belongsToMany 관계이므로이 테이블이 있습니다.Laravel belongsToMany where 중 하나가 없습니다

내가하려는 것은 많은 범주 중 하나에있는 비디오의 단일 인스턴스가없는 모든 비디오를 가져 오는 것입니다.

  • 비디오 1
  • 비디오 3 카테고리에 1

내가 얻을하고자하는 카테고리 1, 2, 3

  • 비디오 2 카테고리 1과 3 인에 비디오는 카테고리 2 또는 3에 속하지 않습니다. 즉, 비디오 3을 반환합니다.

    의도 한 결과를 얻지 못했지만 지금까지 시도한 것은 비디오 1에서 다른 행을 찾았 기 때문입니다. 2, 카테고리 1에 속하기 때문에 :

    Video::whereHas('categories', function($query) { 
        $query->whereNotIn('category_id', [2,3]); 
    })->take(25)->get(); 
    

    이에서 채워 쿼리는 다음과 같습니다

    select * from `videos` where exists (select * from `categories` inner join 
    `category_video` on `categories`.`id` = `category_video`.`category_id` where 
    `videos`.`id` = `category_video`.`video_id` and `category_id` != ? and 
    `category_id` != ? and `categories`.`deleted_at` is null) and `videos`.`deleted_at` 
    is null order by `created_at` desc limit 25 
    
  • +0

    더러운 솔루션의 비트는 것 진술에없는 곳에서는 2를, 두 범주 모두에 대해서는 1을 사용하십시오. – milo526

    +0

    그래,하지만 나는 문자 그대로 약 100 개의 카테고리를 가지고 있다고 생각했는데, 나는 항상 foreach 할 수 있다고 생각하니? – Karl

    +0

    실제로, 심지어 어디에서와 같은 반환하지 않습니다 NotIn, 그렇지 않을까요? – Karl

    답변

    0

    당신이 사용할 수있는 웅변의 whereDoesntHave() 제약은 당신이 필요로하는 무엇을 얻을 :

    // get all Videos that don't belong to category 2 and 3 
    Video::whereDoesntHave('categories', function($query) { 
        $query->whereIn('id', [2, 3]); 
    })->get(); 
    

    +0

    불행하게도 이것은 여전히 ​​같은 결과를 돌려주고있다 :/ – Karl

    +0

    다른 쿼리와 같은 결과를 줄 수는 없지만 적어도 하나는 가지고있는 비디오를 가져왔다. 카테고리 2와 3 이외의 카테고리입니다.이 카테고리는 ID가 2 또는 3 인 카테고리가없는 동영상을 제공합니다. –

    +0

    정확한 결과는 아니지만 카테고리 2 또는 3에있는 동영상은 계속 반환됩니다. 카테고리 1 – Karl

    관련 문제