需要有关查询生成器和 twig Symfony 的帮助

Need help on query builder and twig Symfony

我正在尝试实现私信功能。

我的目标是: 经过身份验证的用户转到消息url,在那里他可以看到:他发送或接收消息的每个人,每个对话都由用户分组,显示最后一条消息和最后一条消息的日期。

我的问题是:我确实检索到了消息,但我找不到只向用户显示一次的方法(例如,如果您向收件人发送了消息,他给你发了一条,对话显示两次,一次是你给他发消息,一次是他发给你。)

我真的不知道如何解释清楚,但我想做类似 twitter/messages 的事情。

Database table structure image, with the foreign keys linked to user_id in user table

我尝试了什么:

     /**
     * @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 %}

您对更改数据库的体系结构有很好的建议,最好的解决方案就是这样做。但是如果你真的不想或不能改变它,有办法让它发挥作用。因为有时我们就是做不到。

  1. 编辑查询:

您可以在查询中创建自定义列:

->select('CASE WHEN m.sender = :user THEN m.recipient ELSE m.sender END AS correspondentUser')

然后处理结果中的新列

  1. 处理 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;
  }
}