2013-12-09 45 views
1

我試圖建立在拉拉維爾4的消息系統。我有兩個類對話和用戶與他們之間的多對多關係。我在對話輸出已記錄在用戶的通話清單和用戶:在拉拉維爾急切的加載與多對多的關係4

@foreach(User::find(Auth::user()->id)->conversations as $conversation) 

    {{ $conversation->id }} 

    @foreach($conversation->users as $user) 
     {{ $user->name }} 
    @endforeach 

    <br><br> 

@endforeach 

這是工作和輸出對話ID,然後參加那次談話的用戶名。我的問題是,這種方式運行了很多查詢,我無法弄清楚如何使用預加載並仍然只能選擇登錄的用戶對話。任何幫助將非常感激!

編輯:

用下面的代碼我得到正確的輸出,但仍然查詢數據庫的很多:

<?php $user = User::with('conversations')->find(Auth::user()->id); ?> 

{{ $user->username }}'s conversations<br><br> 
@foreach($user->conversations as $conversation) 
    {{ $conversation->id }} 
    @foreach($conversation->users as $user) 
     {{ $user->name }} 
    @endforeach 
    <br> 
@endforeach 

我真的很希望能夠貪婪加載這部分@foreach( $ conversation->用戶爲$ user)。它輸出:

USER_1的對話

1 USER_1 user_2

5 USER_1 user_3

回答

2

我相信在任何情況下都只會有1用戶會話活躍。爲什麼你需要foreach來循環使用logged in用戶?你的應用程序如何工作?

要急於負載:

$user = User::find(Auth::user()->id); 

$conversations = $user::with('conversation')->get(); 

或由@大衛巴克指出:

User::with('conversation')->find(Auth::user()->id) 

會話可以屬於多個用戶。所以:

$conversation_id = []; 

@foreach($user->conversations as $conversation) 
    array_push($conversation_id, $conversation->id); 
@endforeach 

$conversations_with_users = Conversation::with('user')->whereIn('id', $conversation_id); 

現在遍歷$ conversations_with_users。

+1

仍然對用戶運行兩個查詢。 User :: with('conversations') - > find(Auth :: user() - > id);只要Auth用戶被緩存,'會更有效率。否則,將Auth擴展到總是急切的加載對話會更好。 –

+0

@Lucky Soni:是的,只有一個活躍用戶,但我需要循環用戶的對話。然後再次循環用戶進行每次對話。在嘗試解決方案後,我編輯了我的問題。希望你能幫忙,以便我可以標記爲已解決。 –

+0

@ mr2_kasper檢查更新答案 –