我需要获取订单数组,其中包含第一个和最后一个 OrderItem。表 order_item:
ID | order_id | 地位 |
---|---|---|
1 | 1 | 0 |
2 | 1 | 1 |
3 | 1 | 0 |
4 | 1 | 1 |
5 | 1 | 0 |
订单实体
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
/**
* Order
*
* @ORM\Entity
* @ORM\Table(name="orders")
*/
class Order
{
/**
* @var int
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @Serializer\Groups(groups="order_list")
*/
private $id;
/**
* @var string
* @ORM\Column(name="title", type="string", nullable=false)
* @Serializer\Groups(groups={"order_list"})
*/
private $title;
/**
* @var Collection
* @ORM\OneToOne(targetEntity="OrderItem", mappedBy="orderFirst")
* @Serializer\Groups(groups={"order_list"})
*/
private $orderItemFirst;
/**
* @var Collection
* @ORM\OneToOne(targetEntity="OrderItem", mappedBy="orderLast")
* @Serializer\Groups(groups={"order_list"})
*/
private $orderItemLast;
/**
* @var Collection|OrderItem[]
* @ORM\OneToMany(targetEntity="OrderItem", mappedBy="order")
* @Serializer\Groups(groups={"order_list"})
*/
private $items;
public function __construct()
{
$this->items = new ArrayCollection();
}
// getters and setters ...
}
OrderItem 实体
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
/**
* Order
*
* @ORM\Entity
* @ORM\Table(name="order_item")
*/
class OrderItem
{
/**
* @var int
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @Serializer\Groups(groups="order_list")
*/
private $id;
/**
* @var Order|null
* @ORM\OneToOne(targetEntity="Order", inversedBy="orderItemFirst")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="order_id", referencedColumnName="id")
* })
*/
private $orderFirst;
/**
* @var Order|null
* @ORM\OneToOne(targetEntity="Order", inversedBy="orderItemLast")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="order_id", referencedColumnName="id")
* })
*/
private $orderLast;
/**
* @var Order|null
* @ORM\ManyToOne(targetEntity="Order", inversedBy="items")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="order_id", referencedColumnName="id")
* })
*/
private $order;
/**
* @var bool
* @ORM\Column(type="boolean", nullable=false)
* @Serializer\Groups(groups="order_list")
*/
private $status;
// getters and setters...
}
服务中的代码
$repository = $em->getRepository(\App\Entity\Order::class);
$qb = $repository->createQueryBuilder('t');
$qb
->leftJoin('t.orderItemFirst', 'oi', \Doctrine\ORM\Query\Expr\Join::WITH, 'oi.status = :status')
->leftJoin('t.orderItemFirst', 'oi2', \Doctrine\ORM\Query\Expr\Join::WITH, 'oi2.status = :status AND oi2.id > oi.id')
->leftJoin('t.orderItemLast', 'oi3', \Doctrine\ORM\Query\Expr\Join::WITH, 'oi3.status = :status')
->leftJoin('t.orderItemLast', 'oi4', \Doctrine\ORM\Query\Expr\Join::WITH, 'oi4.status = :status AND oi4.id < oi3.id')
->setParameter('status', true)
->addSelect('oi')
->addSelect('oi3')
->where('oi2.id IS NULL')
->andWhere('oi4.id IS NULL')
->groupBy('t.id')
;
$query = $qb->getQuery();
$query->setHint(\Doctrine\ORM\Query::HINT_REFRESH, true);
/*
* This returns
* "orderItemFirst": {"id": 4}
* "orderItemLast": {"id": 4}
*/
$result = $query->getResult();
但 getArrayResult() 返回正确的数据:
"orderItemFirst": {
"id": 2,
"status": true
},
"orderItemLast": {
"id": 4,
"status": true
}
即使我一开始调用 getArrayResult(),getResult() 也会开始正确补水。多么奇怪的行为?可以在不重复执行查询的情况下完成吗?