在laravel 4中渴望加载多对多的关系

时间:2013-12-09 12:54:04

标签: php laravel laravel-4

我正在尝试在laravel 4中设置消息传递系统。我有两个类Conversation和User,它们之间有很多对多关系。我正在输出已登录用户的对话列表以及对话中的用户:

@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-&gt; users as $ user)。它输出:

user_1的对话

1 user_1 user_2

5 user_1 user_3

1 个答案:

答案 0 :(得分:2)

我相信在任何情况下,只有1个用户会话处于活动状态。为什么需要foreach来遍历logged in个用户?你的申请是如何运作的?

急切加载:

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

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

或者正如@David Barker指出的那样:

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。