gpt4 book ai didi

php - Doctrine 收集条件 isNull

转载 作者:行者123 更新时间:2023-12-05 06:34:46 25 4
gpt4 key购买 nike

我有一个 User 实体,我尝试通过与 UserGroup 的多对多关系加入它。它工作正常,但我尝试过滤连接的实体,因为我使用了一个软删除字段。

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”。

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

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

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

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

最佳答案

不幸的是,您不能将 Criteria::expr()->isNull() 用于 ManyToMany 关系。在 doctrine/orm GitHub 存储库中有几个长期存在的问题 - 1 , 2 .

作为解决方法,您可以像这样手动过滤掉空值:

$this->groups->filter(function ($group) {
return null === $group->getDeletedAt();
});

但您必须注意,这将从数据库加载所有 Users UserGroups 并将它们分别传递给过滤器函数。与 ->matching() 方法相反,后者构建 SQL 查询并且不会加载任何已删除的用户组。

关于php - Doctrine 收集条件 isNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com