我目前正在Laravel中创建一个基本的私人消息系统。在我的数据库中,我有一个消息表。其中两列是“sender_id”和“recipient_id”。
我想要做的是使用eloquent来浏览此表并在收件箱中列出当前登录用户ID在这些列中列出的所有时间。然后我将使用“distinct”来忽略重复的条目,以便用户只列出一次。使用此ID,我可以显示收件人的用户名,这样当用户点击用户名时,它将把他们带到该用户的消息线程。
为了测试,我目前只检索列“recipient_id”并将其输出到刀片中。以下是我认为应该只输出一次收件人的行,尽管在表中多次被发现。
MessageController
$messages = Message::where('recipient_id', $user)->distinct('recipient_id')->get();
然而,在刀片服务器中,同一个用户正在输出两次(因为他们发现了2条消息),我希望不同的功能可以删除重复的条目。
我也试过
$messages = Message::where('recipient_id', $user)->distinct()->get();
但那也行不通。
如果我收到来自2个不同用户的3封邮件,则会输出如下内容:
来自:
的消息应该输出什么
由于
答案 0 :(得分:1)
您应该使用类似这样的内容:
$data = Message::select([ DB::raw('DISTINCT(recipient_id)')'])
->where('recipient_id', $user)
->get();
与其使用集合,不如使用集合时,返回的是您需要或不需要的所有数据,然后对其进行过滤。但是在查询中使用distinct时,只需将它们放在一个过程中即可。
或者您可以尝试以下选项之一:mentioned here
$diff = Crud::distinct()->pluck('name');
$diff = Crud::distinct()->get(['name']);
$diff = Crud::distinct()->select('name')->get();
答案 1 :(得分:0)
使用Laravel Collection并将代码更改为:
$messages = collect(Message::where('recipient_id', $user)->get());
$messagesUnique = $messages->unique('recipient_id');
$messagesUnique->values()->all();
答案 2 :(得分:0)
您可以按照这个
$payment = Payment::with('invoice','customer')->get();
$payment = $payment->unique('customer_id');
它将返回所有唯一的客户付款数据。