我有一个名为Products
<?php
class Product
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product", inversedBy="list")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_parent", referencedColumnName="id", nullable=true)
* })
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Product", mappedBy="parent")
*/
private $list;
//... more properties
}
getList
方法如下:
public function getList()
{
if($this->list !== null){
return $this->list->getValues();
}
}
现在,在控制器中我遇到了问题,有时我需要按相同实体的属性来过滤列表,而有时我需要不使用过滤器的列表。
我使用dql创建查询:
$query = "SELECT p
FROM AppBundle:Product p
WHERE (p.parent= 0 OR p.parent IS NULL)
AND p.code != '' ";
$createdQuery= $this->em->createQuery($query)->setParameters($params);
$result= $createdQuery->getResult();
查询得出的产品具有正确的数据,但是如果我尝试打印$products[0]->getList()
,它将检索所有子产品,而我只需要检索具有p.code而不是空白的产品字符串。
是否有一种方法可以将所有特定条件应用于查询的完整结果,或者以某种方式将参数传递给getList()
方法,以对该逻辑应用逻辑以有时过滤列表的结果,并有时不过滤列表?
更新
我从数据库中检索到的数据示例:
Product 1
{
id : 1,
parent : null,
code: 'aa',
list : [
Product 2
{
id : 2,
parent : object with the product 1,
code: '',
list : []
}
]
}
Product 3
{
id : 3,
parent : null,
code: 'bb',
list : []
}
有时候我只需要检索所有产品,有时我只需要那些活跃的女巫= 1。
通过示例中的查询,我可以正确检索所有产品,但是AND p.code != ''
仅适用于根目录中的产品。我想将此过滤器应用于list属性,但不总是如此。
答案 0 :(得分:1)
从数据库中检索所有数据之后,或者在查询过程中,您都可以这样做。
之后
Doctrine为您提供的列表($this->list
是一个ArrayCollection
,其中包含一个matching
方法,用于返回一组经过过滤的实体。
您必须向其传递Criteria
对象,例如:
public function getList($myParam = null)
{
if ($myParam) {
$crit = Criteria::create();
$crit->andWhere(Criteria::expr()->eq('myField', $myParam));
return $this->list->matching($crit)->getValues();
}
}
这将返回$this->list
等于->myField
的{{1}}的所有实体
在期间
您还可以通过使用Join和其他条件修改查询来直接过滤关联结果:
$myParam
您还可以使用QueryBuilder有条件地修改查询(如果您使用教义,则不能错过该东西):
$query = "SELECT p
FROM AppBundle:Product p
LEFT JOIN p.list child WITH child.active = :active
WHERE (p.parent= 0 OR p.parent IS NULL)
AND p.code != ''";
$createdQuery= $this->em->createQuery($query)->setParameters([
'active' => 1
]);
$result= $createdQuery->getResult();