0

我需要获取订单数组,其中包含第一个和最后一个 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() 也会开始正确补水。多么奇怪的行为?可以在不重复执行查询的情况下完成吗?

4

0 回答 0