2017-11-07 1 views
0

세 방향 피벗 테이블을 사용하여 작업 할 때 Laravel에서 열심히로드하는 데 어려움을 겪고 있습니다. 다음과 같이 데이터베이스 설정 : redeems 분명히 피벗 테이블열심히로드하는 세 방향 피벗 테이블 Laravel

+-------+--------+-------+-------------+ 
| deals | venues | users | redeems | 
+-------+--------+-------+-------------+ 
| id | id  | id | deal_id  | 
| title | name | name | user_id  | 
|  |  |  | venue_id | 
|  |  |  | redeemed_at | 
+-------+--------+-------+-------------+ 

. 이 같은 사용자 모델의 모습 :

<?php 

class User extends Authenticatable 
{ 
    /** 
    * The deals redeemed by the user. 
    */ 
    public function deals() 
    { 
     return $this->belongsToMany(Deal::class, 'redeems') 
      ->withPivot(['venue_id', 'redeemed_at']); 
    } 
} 

이 날이 작업을 수행 할 수 있습니다 :

$users = Users::with('deals')->all(); 

을 그리고 나서 사용자의 좋은 개요와 그들이 같은 구조로 구속 한 모든 거래를 얻을 이 :

{ 
    "id": 1, 
    "name": "Diederik", 
    "deals": [ 
    { 
     "id": 33, 
     "title": "Deal Title", 
     "pivot": { 
     "user_id": 1, 
     "deal_id": 33, 
     "venue_id": 50 
     } 
    } 
    ] 
} 

지금은 그 대신 나중에 $user->pivot->venue_id 쿼리의 열망로드하여 장소 정보를 추가하고 싶습니다. $users = Users::with('deals.venue')->all();하지만 거래 테이블이 장소에 외부 키를 가지고 있지 않기 때문에 문제가 해결되지 않습니다

은 내가 deal 모델의 belongsTo 관계를 설정하고 다음과 같이와 중첩을 수행했습니다. 거래가 여러 장소에 적용될 수 있기 때문입니다.

정상적인 데이터베이스 쿼리를 사용하면 매우 쉽게 달성 할 수 있다는 사실을 알고 있습니다.하지만 API가 작동하는 방식에 대해서는 URL 설정에서 이와 같은 방법을 사용하여 찾을 수있는 웅변적인 with 관계 함수를 사용해야합니다.

TLDR : 중첩 된 3 방향 피벗 테이블 관계를로드하는 방법.

답변

0

질문을 올바르게 이해하고 있다면 특정 장소를 찾고자하는 거래와 장소간에 일대 다의 관계가 있습니다. 일반적으로, 당신은 당신이 더 장소를 필터링하려면 다음 경우, 귀하의 거래 모델에 hasMany의() 또는 belongsToMany() 관계를 만들 것입니다, 당신과 같이 웅변 하위 쿼리를 작성합니다

// Gets first venue of deals 
Users::with('deals', 'deals.venues' => function ($query) { 
    $query->first(); 
})->all(); 
+0

답변 해 주셔서 감사합니다. '거래'와 '장소'의 관계는 다 대 다수이다. 한 거래는 여러 장소에서 상환 할 수 있으며 장소는 여러 거래를 제공 할 수 있습니다. 그러므로 제안하는 것은 작동하지 않을 것입니다. 왜냐하면 그 둘을 연결하는 다른 피벗 테이블 ('deals_venue')이 있기 때문입니다. – Diederik

+0

다시 말하자면, 당신이 제안하는 것은 효과가 있지만 그 다음에는 그 거래를 제공하는 모든 장소가 주어지며 거래가 회수되는 특정 장소는받지 못할 것입니다. 개최지와 거래 사이 관계는 나의 질문을 위해 진짜로 중요하지 않다, 그래서 나는 나의 최초 질문에서 그것을 생략했다. – Diederik

0

내가 있습니다 sugest 것 피봇 테이블을 다른 모델 (상환)으로 취급해야합니다. 그런 다음 일대 다른 테이블/모델과의 관계 (거래/장소/사용자)를 만들 그래서 당신은 당신이 필요 게으른 부하에 다음과 같은 개체를 웅변을 사용하여 쿼리를 만들 수 :

$redeems = User::find($id)->redeems; 
$redeems->load(['venue','deal']); 

return $redeems; 

이 서식을 지정하려면 데이터/응답을 사용하는 경우 API Resources 정확한 방법으로 사용할 수 있습니다. 또는 Fractal (5.4 이하)

+0

당연히 나는 당신의 대답에 대해 감사하지만, 나는 당신이 제안한 것처럼 실제로 문제를 해결했다고 고백해야합니다. 그러나 논쟁을 위해서 나는 어쨌든 여기에 질문을 올렸다. 어떤면에서는 이런 식으로 바람 피는 것 같은 느낌이 듭니다. 게다가 이제는'attach' 나'sync'와 같은 멋진 기능을 사용할 수 없습니다. 맞습니까? 다른 방법이 있는지 궁금 해서요. – Diederik

관련 문제