Symfony применяет критерии в отношении - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть объект с именем 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 != '' применяется только к тем, которые находятся в корне. Я хочу применить этот фильтр к свойству списка, но не всегда.

1 Ответ

1 голос
/ 01 октября 2019

Либо вы можете сделать это после получения всех данных из БД, либо во время запроса.

После

Список, который 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, равный $myParam

Больше информации здесь: https://www.doctrine -project.org / projects / doctrine-orm / en /2.6 / reference / working-with-association.html # filtering-collection

В течение

Вы также можете напрямую отфильтровать связанные результаты, изменив запрос с помощьюПрисоединение и дополнительные условия:

$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();

Вы также можете условно изменить запрос, используя QueryBuilder (вы не можете пропустить эту вещь, если выполните Doctrine):

$queryBuilder = $this->em->createQueryBuilder()
  ->from('AppBundle:Product', 'p')
  ->where('(p.parent= 0 OR p.parent IS NULL) AND p.code != ""');

if ($onlyActive)
    $queryBuilder
        ->leftJoin('p.list', 'child', 'child.active = :active')
        ->setParameter('active', 1);

$result = $queryBuilder->getQuery()->getResult();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...