学说收集标准是Null

时间:2018-04-29 20:34:30

标签: php symfony doctrine-orm orm frameworks

我有一个用户实体,我尝试加入与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')));
    }

    // ...
}

问题:如果条件包含任何空值,则该原则不会将其用于sql查询。这意味着,在这个例子中,SELECT语句不会在其中包含任何“deleted_at IS NULL”。

我找到了原因,因为doctrine在SqlValueVisitor.php中过滤了它

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

好的,但这个问题的解决方案是什么?或者,如果我使用doctrine2,我无法过滤空字段?

我知道,我可以使用doctrine过滤器,但我不想要,因为在我的情况下(在这个例子中)它很简单,但我从代码dinamicly构建这个过滤器。

1 个答案:

答案 0 :(得分:0)

你可以尝试

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