使用摘要查询 table symfony2

Query using a summary table symfony2

有我的实体:

具有 属性 产品的订单实体

/**
 * @var string
 *
 * One Order has Many OrderProduct.
 * @ORM\OneToMany(targetEntity="OrderProduct", mappedBy="order")
 */
private $product;

/**
 * CatalogOrder constructor.
 */
public function __construct() {
    $this->product = new ArrayCollection();
}

具有产品、订单和编号属性的 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();
}

我想在前端查找订单中的商品名称,即输入"be",显示所有带有商品"beer"的订单。

我的猜测不正确:

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

我现在知道你的问题出在哪里了。这不是您处理联合实体的方式。您还需要加入来自 OrderProductProduct 实体。它应该是这样的:

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

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

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