使用摘要查询 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'].'%');
我现在知道你的问题出在哪里了。这不是您处理联合实体的方式。您还需要加入来自 OrderProduct
的 Product
实体。它应该是这样的:
$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'].'%')
;
有我的实体:
具有 属性 产品的订单实体
/**
* @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'].'%');
我现在知道你的问题出在哪里了。这不是您处理联合实体的方式。您还需要加入来自 OrderProduct
的 Product
实体。它应该是这样的:
$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'].'%')
;