Symfony将标准应用于
我有一个名为Symfony将标准应用于,symfony,symfony-3.4,Symfony,Symfony 3.4,我有一个名为Products <?php class Product { /** * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Produc
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
}
现在,在控制器中,我遇到了一个问题,有时我需要按同一实体的属性过滤列表,而有时我需要不带过滤器的列表
我使用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的产品
通过示例中的查询,我正确地检索了所有产品,但是
和p.code!=''代码>仅适用于根目录中的代码。我想将此筛选器应用于列表属性,但并不总是如此。您可以在从数据库检索所有数据后或在查询过程中执行此操作
之后
条令提供给您的列表($this->list
)是一个数组集合
,它包含一个匹配
方法来返回一组过滤过的实体
您必须向其传递条件
对象,如下所示:
公共函数getList($myParam=null)
{
如果($myParam){
$crit=Criteria::create();
$crit->andWhere(条件::expr()->eq('myField',$myParam));
返回$this->list->matching($crit)->getValues();
}
}
这将返回$This->list
中具有->myField
等于$myParam
这里有更多信息:
在
还可以通过使用联接和附加条件修改查询来直接筛选关联结果:
$query=“选择p
来自AppBundle:产品p
将p.list子项与child.active=左连接:active
其中(p.parent=0或p.parent为空)
和p.code!='';
$createdQuery=$this->em->createQuery($query)->setParameters([
“活动”=>1
]);
$result=$createdQuery->getResult();
您还可以使用QueryBuilder有条件地修改查询(如果您这样做,您不会错过这件事):
$queryBuilder=$this->em->createQueryBuilder()
->from('AppBundle:Product','p')
->其中('(p.parent=0或p.parent为NULL)和p.code!=“”);
如果($onlyActive)
$queryBuilder
->leftJoin('p.list','child','child.active=:active')
->setParameter('active',1);
$result=$queryBuilder->getQuery()->getResult();
但是如何将参数发送到getList()?我必须对查询返回的每个产品调用getList方法?因为现在,getList方法是自动的,并且只有一个查询,对于每个产品,我都会得到子产品的列表。你能提供一个具体的问题示例吗?这个参数是什么?什么会自动调用getList?表单?查询自动调用getList(),因为如果我转储查询结果,在每个产品中,我会看到属性列表,其中包含或不包含对象,这取决于产品是否有子对象。我引用的参数就是您示例中的参数,我不是从任何地方调用getList(),doctrine会自动填充这个变量,然后您所要做的就是使用条件进行连接。我会更新我的答案好的,我会试试
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 : []
}