在doctrine2 / symfony2中使用高级选择

时间:2015-03-24 10:15:33

标签: php regex symfony doctrine-orm advanced-custom-fields

我需要找到一种方法来获取我的职责字段中文本类型的$ text occurrence数。

我试图像这样查询:

select("cv.id, (CHAR_LENGTH(cve.responsibilities)
-
CHAR_LENGTH(REPLACE(LOWER(cve.responsibilities),LOWER(" . $text. "),'')))/CHAR_LENGTH(" . $text . ") AS count")

到symfony2中的queryBuilder。

我知道这种类型的查询远非最佳,但我推动这样做。 我在我的functionNode中添加了一个替换和regexp函数,但主要问题是选择一个字段。以下是我试过的内容(为了您的清晰,我为了额外的变量而拆分代码):

        $qb = $this->createQueryBuilder('a');
        $expr = $qb->select()->expr();

        $diff1 = $expr->length("b.description");
        $diff2 = $expr->length("replace( " . $expr->lower('b.description') . ", " . $expr->lower(':text') .", '')");

        $counter = $expr->diff($diff1, $diff2);
        $denominator = $expr->length(':text');

        $qb->select('a.id,' . $expr->quot(':counter', ':denominator') . 'as count')
            ->join('a.additional', 'b')
            ->where('REGEXP ("[[:<:]]' . $text . '[[:>:]]", b.description)')
            ->andWhere('a.id IN (:Ids)')
            ->setParameters([
                'text' => $text,
                'counter' => $counter,
                'denominator' => $denominator,
                'Ids' => $Ids
            ]);

好的,所以它适用于:

$qb->select('a.id id,' . $expr->quot($counter, $denominator . ' field'))
            ->join('a.additional', 'b')
            ->where("regexp('[[:<:]]" . $text . "[[:>:]]', b.description) != false")
            ->andWhere('a.id IN (:Ids)')
            ->setParameter('text', $text );
        if(!empty($Ids)){
            $qb->andWhere('a.id IN (:Ids)')
                ->setParameter('Ids', $Ids);
        }

3 个答案:

答案 0 :(得分:0)

对于大数据使用SQL查询总是比使用DQL更好,尝试这样的事情:

LENGTH( cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '. $text.', '')) AS counts 

这应该给你在现场责任中的计数或出现。

答案 1 :(得分:0)

您可以在您的存储库类中添加它,调用并获得我在我身边测试过的结果

public function getTested()
    {   
        return $this->createQueryBuilder('cve')
            ->select("cve.id, (LENGTH(cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '". $text ."','')))/LENGTH('". $text ."')")
            ->getQuery()->getArrayResult();
    }

这里REPLACE功能做以下链接 Doctrine query - ignoring spaces

答案 2 :(得分:0)

所以我无法使用

 $qb->select('a.id,' . $expr->quot(':counter', ':denominator') . 'as count')

相反,我已将名称从'count'更改为'field',并将其删除为'as'

$qb->select('a.id id,' . $expr->quot($counter, $denominator . ' field'))

我使用了:replace classregexp

它有效。问题解决了