>

Laravel에서는 다음과 같이 관계를 설정할 수 있습니다 :

class User {
    public function items()
    {
        return $this->belongsToMany('Item');
    }
}

사용자를위한 피벗 테이블의 모든 항목을 가져올 수 있도록 허용 :

Auth::user()->items();

그러나 그 반대를 원한다면 어떨까요? 그리고 사용자가 아직 가지고 있지 않은 모든 항목을 가져옵니다. 피벗 테이블에는 없습니다.

이 작업을 수행하는 간단한 방법이 있습니까?


  • 답변 # 1

    간단 함과 대칭을 위해 사용자 모델에서 새로운 방법을 만들 수 있습니다 :

    // User model
    public function availableItems()
    {
        $ids = \DB::table('item_user')->where('user_id', '=', $this->id)->lists('user_id');
        return \Item::whereNotIn('id', $ids)->get();
    }
    
    

    전화를 사용하려면 :

    Auth::user()->availableItems();
    
    

  • 답변 # 2

    Illuminate\Database\Eloquent\Builder 클래스의 소스 코드를 보면 , 우리는라 라벨에 이것을 수행하는 두 가지 방법이 있습니다 : whereDoesntHave  (와이즈 비즈의 반대편) ) 및 whereHas  (와이즈 비즈의 반대편) )

    doesntHave
    
    

    이것은 저에게 올바르게 작동합니다!

    간단한 "관계가 존재하지 않는"경우 다음을 사용하십시오 :

    has
    
    

    죄송합니다. 영어를 이해하지 못합니다. Google 번역기를 사용했습니다.

  • 답변 # 3

    간단하지는 않지만 일반적으로 가장 효율적인 방법은 하위 쿼리를 사용하는 것입니다.

    // SELECT * FROM users WHERE ((SELECT count(*) FROM roles WHERE user.role_id = roles.id AND id = 1) < 1)  AND ...
        User::whereDoesntHave('Role', function ($query) use($id) {
              $query->whereId($id);
        })
        ->get();
    
    

    이것이 내가 한 일이라면 나는 종종 그것을 아이템 모델에 스코프 메소드로 추가 할 것이다

    User::doesntHave('Role')->get();
    
    

    그러면 나중에 이렇게 사용하십시오.

    $items = Item::whereNotIn('id', function ($query) use ($user_id)
        {
            $query->select('item_id')
                ->table('item_user')
                ->where('user_id', '=', $user_id);
        })
        ->get();
    
    

  • 답변 # 4

    왼쪽 조인은 어떻습니까?

    테이블이 class Item extends Eloquent { public function scopeWhereNotRelatedToUser($query, $user_id) { $query->whereNotIn('id', function ($query) use ($user_id) { $query->select('item_id') ->table('item_user') ->where('user_id', '=', $user_id); }); } } 라고 가정 $items = Item::whereNotRelatedToUser($user_id)->get();  그리고 users  모든 items 찾기  사용자 item_user 와 연관되지 않은 :

    items
    
    

  • 답변 # 5

    이것이 당신을 위해 작동합니다

    123
    
    
    DB::table('items')->leftJoin( 'item_user', function ($join) { $join->on('items.id', '=', 'item_user.item_id') ->where('item_user.user_id', '=', 123); }) ->whereNull('item_user.item_id') ->get();

관련 자료

  • 이전 c++ - 구조에서 비트 배열을 얻는 방법?
  • 다음 gradle 사용자 정의 플러그인 - gradleapi () vs 명시 적 종속성