Has Many Through 는 서로 떨어져 있고 직접적인 관계가 없는 모델들이 중간 모델을 통해서 연결되는 것을 의미합니다.

예를 들면, users 테이블과 tasks 테이블은 직접적인 관계가 없지만 projects 테이블을 통해 사용자가 갖고 있는 다수의 task 모델을 손쉽게 가져올 수 있습니다.

 

이제 User 모델 클래스에 가져올 테이블 이름과 동일한 메소드를 만들고 그안에 hasManyThrough($related, $through, $firstKey = null, $secondKey = null, $localKey = null) 메소드를 사용합니다.

첫 번째 파라미터는 가져올 테이블 모델 클래스이고 두 번째 파라미터는 중간 단계 역할을 할 모델 클래스 이름입니다.

class User extends Model 
{
    public function tasks()
    {
        return $this->hasManyThrough(Task::class, Project::class);
    }
CODE

 

이제 관계 설정이 끝났고 Orm 컨트롤러에 사용자의 tasks 를 가져오는 테스트용 메소드를 만들어 봅시다.

public function getHasManyThrough($id)
{
    $tasks = User::findOrFail($id)->tasks()->orderBy('created_at')->get();
    dump($tasks);		
}
CODE

 

이제 브라우저로 http://homestead.app/orm/has-many-through/2 에 연결하면 id 가 2 인 사용자의 모든 tasks 를 가져와서 표시합니다.

현재 eloquent 에는 hasOneThrough 기능이 없으므로 task 모델에서 바로 User 모델을 가져올 수는 없습니다.