gpt4 book ai didi

Symfony2 DQL 如何连接 OneToMany 关系中的最后一行

转载 作者:行者123 更新时间:2023-12-02 18:21:55 26 4
gpt4 key购买 nike

我有两个通过 OneToMany 关系关联的实体:

<?php

namespace CRMBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* User
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="CRMBundle\Entity\ContactRepository")
*/
class User
{

/*...*/

/**
* @ORM\OneToMany(targetEntity="CRMBundle\Entity\Message", mappedBy="user", cascade={"persist"})
* @ORM\OrderBy({"datetime" = "DESC"})
*/
protected $messages;

/*...*/

}

还有

<?php

namespace CRMBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Message
*
* @ORM\Table()
* @ORM\Entity
*/
class Message
{

/*...*/

/**
* @ORM\ManyToOne(targetEntity="CRMBundle\Entity\User", inversedBy="messages")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="SET NULL")
*/
private $user;

/**
* @var \DateTime
*
* @ORM\Column(name="Datetime", type="datetime", nullable=true)
*/
private $datetime;



/*...*/
}

我的问题是如何在 UserController 中创建一个查询来获取每个用户的最后一条消息(即根据日期时间属性的最新消息)?

最佳答案

我想您要找的内容在 one of my previous answers 中至one of my own questions ^^

您必须使用子查询来动态选择一个用户消息的最新日期时间值,并加入具有该值的消息。

为此,您必须定义选择 message.datetime 的 MAX 值的(子)查询:

$qb2= $this->createQueryBuilder('ms')
->select('MAX(ms.datetime) maxDate')
->where('ms.user = u')
;

然后在您的 join 子句中使用它,整个函数位于您的 UserRepository 中:

$qb = $this->createQueryBuilder('u');
$qb ->leftJoin('u.messages', 'm', 'WITH', $qb->expr()->eq( 'm.datetime', '('.$qb2->getDQL().')' ))
->addSelect('m');

然后,您的用户(每个人)将拥有一个消息集合,其中包含一条(如果没有来自用户的消息则为 null)消息,您将通过以下方式获得该消息:

$user->getMessages()->first();

但是如果你使用Symfony的延迟加载功能,因为你已经在user.messages属性上定义了orderby注释,调用

$user->getMessages()->first()

应该返回给您最新的消息(但也会以静默方式加载所有其他消息)。为了避免这种静默的第二个数据库查询,您可以将其直接加入到请求用户的查询中:

$qb = $this->createQueryBuilder('u');
$qb ->leftJoin('u.messages', 'm')
->addSelect('m');

关于Symfony2 DQL 如何连接 OneToMany 关系中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com