Symfony应用相关标准

时间:2019-09-30 14:12:37

标签: 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\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属性,但不总是如此。

1 个答案:

答案 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}}的所有实体

此处的更多信息:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-associations.html#filtering-collections

期间

您还可以通过使用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();