代码之家  ›  专栏  ›  技术社区  ›  Oleg Shleif

使用汇总表symfony2进行查询

  •  1
  • Oleg Shleif  · 技术社区  · 7 年前

    /**
     * @var string
     *
     * One Order has Many OrderProduct.
     * @ORM\OneToMany(targetEntity="OrderProduct", mappedBy="order")
     */
    private $product;
    
    /**
     * CatalogOrder constructor.
     */
    public function __construct() {
        $this->product = new ArrayCollection();
    }
    

    属性为product、order和number的OrderProduct实体(该实体用于存储订购产品的数量)

    /**
     * @ORM\ManyToOne(targetEntity="CatalogOrder", inversedBy="product")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="id")
     * @Assert\NotBlank()
     */
    private $order;
    
    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="order")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     * @Assert\NotBlank()
     */
    private $product;
    
    /**
     * @var int
     *
     * @ORM\Column(name="number", type="integer")
     */
    private $number;
    

    具有属性顺序的产品实体

    /**
     * @ORM\OneToMany(targetEntity="OrderProduct", mappedBy="product")
     */
    private $order;
    
    public function __construct()
    {
        $this->order = new ArrayCollection();
    }
    

    我的猜测不是真的:

    $qb->join('o.product', 'p')
        ->where('p.product.name LIKE :name')
        ->setParameter('name', '%'.$filters['productName'].'%');
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Jason Roman    7 年前

    我知道你的问题在哪里了。这不是处理连接实体的方式。你还需要加入 Product OrderProduct 。它应该是这样的:

    $qb
        ->join('o.product', 'op')
        ->join('op.product', 'p')
        ->where('p.name LIKE :name')
        ->setParameter('name', '%'.$filters['productName'].'%')
    ;
    

    你真的应该重命名 $product 在你的 Order 实体为 $orderProduct 因此,它与实际实体相匹配,并减少了混淆。一旦这样做,您的查询就会更有意义:

    $qb
        ->join('o.orderProduct', 'op')
        ->join('op.product', 'p')
        ->where('p.name LIKE :name')
        ->setParameter('name', '%'.$filters['productName'].'%')
    ;