我正在尝试在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
答案 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。