Критерии сбора доктрины isNull - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть сущность User, и я пытаюсь присоединить ее к многим пользовательским отношениям с UserGroup. Это работает нормально, но я пытаюсь отфильтровать объединенные объекты, потому что я использую, например, поле softdelete.

class User
{
    // ...

    /**
     * @ORM\ManyToMany(targetEntity="\UserBundle\Entity\UserGroup")
     * @ORM\JoinTable(name="users_groups",
     *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    public function getGroups()
    {
        return $this->groups->matching(Criteria::create()->where(Criteria::expr()->isNull('te.deleted_at')));
    }

    // ...
}

Проблема: если критерий содержит какое-либо значение NULL, доктрина не использует его для запроса SQL. Это означает, что в этом примере инструкция SELECT не содержит никаких «удаленных_И IS НУЛЬ», где.

Я нашел причину, потому что доктрина фильтрует ее в SqlValueVisitor.php

if (($operator === Comparison::EQ || $operator === Comparison::IS) && $value === null) {
    return;
} else if ($operator === Comparison::NEQ && $value === null) {
    return;
}

Хорошо, но как решить эту проблему? Или, если я использую doctrine2, я не могу отфильтровать пустые поля?

Я знаю, я могу использовать доктринальные фильтры, но я не хочу, потому что в моем случае (и в этом примере) все просто, но я строю этот фильтр из кода динамически.

1 Ответ

0 голосов
/ 02 мая 2018

вы можете попробовать

public function getGroups()
{
    return $this->groups->matching(Criteria::create()->where(Criteria::expr()->neq('deleted_at', null)));
}
...