저는 Larabel 5.0으로 웹 API를 개발 중인데 제가 구축하려는 특정 쿼리에 대해서는 잘 모르겠습니다.
제 수업은 다음과 같습니다.
class Event extends Model {
protected $table = 'events';
public $timestamps = false;
public function participants()
{
return $this->hasMany('AppParticipant', 'IDEvent', 'ID');
}
public function owner()
{
return $this->hasOne('AppUser', 'ID', 'IDOwner');
} }
그리고.
class Participant extends Model {
protected $table = 'participants';
public $timestamps = false;
public function user()
{
return $this->belongTo('AppUser', 'IDUser', 'ID');
}
public function event()
{
return $this->belongTo('AppEvent', 'IDEvent', 'ID');
} }
이제 특정 참가자와 모든 이벤트를 받고 싶습니다.시도 대상:
Event::with('participants')->where('IDUser', 1)->get();
하지만where
조건이 에 적용됩니다.Event
그 위에 있지 않다Participants
예외는 다음과 같습니다.
Participant::where('IDUser', 1)->event()->get();
나는 내가 이것을 쓸 수 있다는 것을 안다.
$list = Participant::where('IDUser', 1)->get(); for($item in $list) {
$event = $item->event;
// ... other code ... }
서버에 많은 쿼리를 보내는 것은 그다지 효율적이지 않은 것 같습니다.
어떻게 하면 가장 좋은 방법으로where
라라벨 5와 웅변가를 사용한 모델 관계를 통해요?
질문에 대한 답변
관계에서 이를 수행하기 위한 올바른 구문은 다음과 같습니다.
Event::whereHas('participants', function ($query) {
return $query->where('IDUser', '=', 1); })->get();
그러면 참가자의 사용자 ID가 1인 이벤트가 반환됩니다.참가자의 사용자 ID가 1인 경우, 이벤트는 반환되지 않습니다.
자세한 것은, https://laravel.com/docs/5.8/eloquent-relationships#eager-loading 를 참조해 주세요.
@Cermbo의 답변은 이 질문과는 관련이 없습니다.그 대답에서Laravel
다 줄게Events
만약 각각이Event
가지다'participants'
와 함께IdUser
의1
.
하지만 당신이 모든 것을 얻고 싶다면Events
모두와 함께'participants'
그 모든 것이 다라면'participants'
을 가지고 있다IdUser
1 의 경우는, 다음과 같은 조작을 실시합니다.
Event::with(["participants" => function($q){
$q->where('participants.IdUser', '=', 1); }])
주의:
인where
모델 이름이 아닌 테이블 이름을 사용합니다.
라라벨 8.57+용
Event::whereRelation('participants', 'IDUser', '=', 1)->get();
여러 조인을 사용하는 경우 다음과 같은 코드를 사용합니다.
$userId = 44; Event::with(["owner", "participants" => function($q) use($userId ){
$q->where('participants.IdUser', '=', 1);
//$q->where('some other field', $userId ); }])
다음 코드 사용:
return Deal::with(["redeem" => function($q){
$q->where('user_id', '=', 1); }])->get();