2016-03-12 55 views
0

你好,我試圖獲得所有屬於這兩個模型之間的樞軸的用戶的評論。我似乎無法繞過它,或者我的數據庫模式可能是錯誤的。無論如何,我會喜歡一些幫助。陷於雄辯的關係 - 樞紐和多態關係

目前我的模型是這樣的:

user.php的

class User extends Model 
{ 
    // Grab all the beers that this user has checked in to his personal profile 
    public function beers() 
    { 
     return $this->belongsToMany('App\Beer')->withTimestamps()->withPivot('rating', 'description'); 
    } 
} 

Beer.php(樞關係)

class Beer extends Model 
{ 
    // polymorphic relationship grab all comments that belong to this beer 
    public function comments() 
    { 
     return $this->morphMany('App\Comment', 'commentable'); 
    } 
} 

Comment.php(成立as polymorphic)

class Comment extends Model 
{ 
    public function commentable() 
    { 
     return $this->morphTo(); 
    } 

    public function user() 
    { 
     return $this->belongsTo('App\User'); 
    } 
} 

此處的代碼抓取屬於啤酒透視記錄的所有註釋。這很好,因爲$ user->啤酒考慮到我們正在處理特定的用戶配置文件,只能從特定的$用戶中找到透視記錄。

$user = User::find($id); 

@foreach($user->beers as $beer) 
    @foreach($beer->comments as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 

不幸的是,意見關係只着眼於從意見表commentable_id和commentable_type,不考慮當前USER_ID(我們當前正在查看的配置文件),所以當我看到一個用戶的另一個配置文件在他的個人資料中具有相同的beer_user樞紐組合,同樣的評論也顯示在那裏。

如何調用我的Beer.php模型的評論關係,以便考慮user_id?很明顯,我已經在我的評論表中添加了一個user_id。我以前試過這個問題,但我希望通過這次稍微詳細一點,現在人們可以幫助我,我也知道如何最終制定這個問題。

數據庫:

enter image description here

+0

沒有嘗試鏈查詢,如$比爾 - >評論() - >在哪裏(「USER_ID」,「=」,$用戶> ID )?順便說一下,你是否打算收到用戶評論?如果您只是願意爲用戶提供啤酒,則不需要變形關係。 – Bartu

+1

我不明白。你想要實現的是什麼查詢? – nextt1

+0

抓住屬於特定用戶的所有啤酒,然後抓住放在該用戶啤酒上的所有評論。當我從我的示例執行查詢時,它可以工作,但查詢不考慮pivot記錄beer_id/user_id組合。 –

回答

1

在這個特定的代碼示例中,我只想用預先加載與用戶ID的限制:

$user = User::with(['beers', 'beers.comments' => function ($query) use ($id) { 
    $query->whereHas('user', function ($query) use ($id) { 
     $query->where('id', $id); 
    }); 
}])->find($id); 

@foreach($user->beers as $beer) 
    @foreach($beer->comments as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 

這種渴望裝載約束只會工作時你提前獲得用戶的ID。

想象一下,然而,你不能限制急切的加載或查詢來獲得評論。你仍然可以過濾收集意見後的事實:

@foreach($user->beers as $beer) 
    @foreach($beer->comments->where('user_id', $user->id) as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 
+0

非常感謝你,我已經搞清楚如何在foreach循環中添加where子句。我試圖做一些愚蠢的事情,比如向關係傳遞一個參數,但最終它就像添加一個where子句一樣簡單。當然,我會堅持急於加載,但非常感謝你,非常感謝你的幫助。被困在這個問題上的時間比我想承認的哈哈還要長。 –

+0

我意識到這仍然不是我正在尋找進一步測試後。您提供的查詢會檢查註釋表中的user_id,但我需要檢查beer_user數據透視表上的user_id。 評論表中的user_id只是告訴哪位用戶發佈了此評論。我需要能夠對我的數據透視表的某個beer_id,user_id組合進行評論,並且只需在輸入App \ Beer作爲commentable_type時搜索beer_id即可。儘管感謝您的幫助。 –