我正在嘗試做一個私人訊息功能。
我的目標是: 經過身份驗證的用戶轉到訊息 url,在那里他可以看到:他發送或接收訊息的每個人,每個對話都按用戶分組,顯示的最后一條訊息和最后一條訊息的日期。
我的問題是:我實際上檢索了訊息,但是我找不到只向用戶顯示一次的方法(例如,如果您向收件人發送了一條訊息,而他向您發送了一條訊息,則會話顯示兩次,一個是你給他發資訊的時候,一個是他給你發資訊的時候。)
我真的不知道如何清楚地解釋這一點,但我想做一些類似 twitter/messages 的事情。
資料庫表結構圖,外鍵鏈接到用戶表中的 user_id
我嘗試了什么:
- 存盤庫:
/**
* @return Message[] Returns an array of Message objects
*/
public function findByUser($user)
{
return $this->createQueryBuilder('m')
->setParameter('user', $user)
->where('m.sender = :user')
->orWhere('m.recipient = :user')
->groupBy('m.recipient')
->orderBy('m.date', 'DESC')
->getQuery()
->getResult();
}
- 控制器:
#[Route('/messages', name: 'app_messages')]
public function index(MessageRepository $messageRepository): Response
{
return $this->render('messages/index.html.twig', [
'messages' => $messageRepository->findByUser($this->getUser()),
'controller_name' => 'MessagesController',
]);
}
- 枝條:
{% for message in messages %}
{% if message.sender.id == app.user.id %}
{% set displayName = message.recipient %}
{% elseif message.recipient.id == app.user.id %}
{% set displayName = message.sender %}
{% endif %}
<a href="{{ path('app_messages_show', {id: message.id}) }}">
<p>{{ displayName.name }}</p>
<p>{{ displayName.username }}</p>
<p>{{ message.date|date }}</p>
<p>{{ message.content }}</p>
</a>
{% else %}
<p>You don't have any message ??</p>
{% endfor %}
uj5u.com熱心網友回復:
您對更改資料庫的體系結構提出了很好的建議,最好的解決方案就是這樣做。但是如果你真的不想或不能改變它,有辦法讓它作業。因為有時我們就是做不到。
- 編輯查詢:
您可以在查詢中創建自定義列:
->select('CASE WHEN m.sender = :user THEN m.recipient ELSE m.sender END AS correspondentUser')
然后處理結果中的新列
- 在 php 中處理雙重訊息:
您可以處理您的訊息陣列以洗掉不必要的訊息
$allMessages = $messageRepository->findByUser($this->getUser())
$correspondentsId = []
$messages = []
foreach($allMessages as $message){
$correspondent = $message->getSender() === $this->getUser() ? $message->getRecipient : $messsage->getSender();
if(!in_array($correspondent->getid(), $correspondentsId) ){
$correspondentsId[] = $correspondent->getId();
$messages[] = $message;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441568.html
