2013-06-23 2 views
2

Laravel의 Eloquent ORM에서 결과 집합을 관련 모델로 필터링 할 수 있습니까? 내가 설득력이 테이블을 조인하지 않고 내가 원하는 결과가 유사 할 것이라는 점을 이해한다! tickets.status_id = statuses.id WHERE statuses.name에 상태를 가입 티켓로부터Eloquent 관계 필터링

SELECT * = '폐쇄 ';

나는 웅변에서 발견 한 가장 가까운 기능은 다음과 같습니다 이름이 폐쇄되지 않은 경우 여전히 티켓하지만에만 상태의 관계를 모두 반환됩니다

$tickets = Ticket::with(array('status' => function($q) { 
    return $q->where('name', '!=', 'Closed'); 
}))->get(); 

.

또한,이 유창함 수행 할 수 있습니다 알고 있지만, 나는 웅변가 제공하는 중첩 된 개체의 반환 구조로 일하고 싶습니다 :

echo ticket->status->name; 

유창함 것 조인 된 쿼리로 평탄화 된 결과를 반환합니다.

답변

1

너무 복잡하게 만들었던 것처럼 느껴집니다.

$statuses = Status::where('name', '!=', 'Closed')->list('id'); 
$tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get(); 

또는, 내가 정말하고 싶지 않은 상태 중 방향 ...을 갈 수 있지만, 내 쿼리 수를 줄일 :

$statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get(); 
0

모델에 hasOne ('status') 관계를 정의하고 해당 을 사용할 수는 있지만 개인적으로 시도하지 않았습니다.

+0

티켓은 status_id (티켓) 상태로 표시됩니다. 상태에는 많은 티켓이 있습니다. – dhudson

0

모델 관계에 쿼리 범위를 추가해보십시오. Laravel. Use scope() in models with relation

Laravel 4.2

이 질문은 오래된,하지만 경우에 당신이 그것이 여기에 진짜 대답을 찾고 있다면 보인다
2

, 우리는 너무 많이 허용 대답 할 데이터베이스를 쿼리하지 않도록하기 위해 최선을 시도해야 두 번이나 이걸 한 번만하면 끝낼 수 있습니다.

$tickets = Ticket::with('status')->whereHas('status', function($q) { 
    return $q->where('name', '!=', 'Closed'); 
})->get(); 
관련 문제