Doctrine findBy有多个条件字段

时间:2018-01-06 22:17:21

标签: symfony doctrine-orm

我在表中有一些不良数据,但并非所有字段都有空值,如果可能的话,我希望通过实现类似的东西来获得所有错误的行。

$contactObj = $this->em->getRepository("ImporterBundle:Contact")
->findBy([$field1 => null OR $field2 => null OR $field3 => null ...]);

是否有解决方案可以执行上述示例而不使用 repositoryClass

2 个答案:

答案 0 :(得分:2)

您可以使用 Doctrine \ ORM \ EntityRepository 匹配(条件$条件)功能:

use Doctrine\Common\Collections\Criteria;

$criteria = $criteria = Criteria::create()
        ->where(Criteria::expr()->isNull('functions'))
        ->orWhere(Criteria::expr()->isNull('salutation'))
        ->orWhere(Criteria::expr()->isNull('category'))
        ->orWhere(Criteria::expr()->isNull('address'))
        ->orWhere(Criteria::expr()->isNull('city'))
        ->orWhere(Criteria::expr()->isNull('company'));

$contactObj = $this->em->getRepository("ImporterBundle:Contact")
        ->matching($criteria);

答案 1 :(得分:1)

所以我只需要使用存储库类

并使用表达式。

public function getBadData() {
    $db = $this->createQueryBuilder('c');

    return $db->select('c')
        ->where($db->expr()->isNull('c.functions'))
        ->orWhere($db->expr()->isNull('c.salutation'))
        ->orWhere($db->expr()->isNull('c.category'))
        ->orWhere($db->expr()->isNull('c.address'))
        ->orWhere($db->expr()->isNull('c.city'))
        ->orWhere($db->expr()->isNull('c.company'))
        ->getQuery()
        ->getResult();
}

正如JimL建议的那样,我使用 orX()

更改了存储库方法
public function getBadData() {
    $db = $this->createQueryBuilder('c');

    return $db->select('c')
        ->where($db->expr()->orX()->addMultiple(
            [
                'c.functions is null',
                'c.salutation is null',
                'c.category is null',
                'c.address is null',
                'c.city is null',
                'c.company is null'
            ]
        ))
        ->getQuery()
        ->getResult();
}

现在应该更具可读性。