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 : []
}