在 doctrine2/symfony2 中使用高级 select
Use advanced select in doctrine2/ symfony2
我需要找到一种方法来获取文本类型的职责字段中 $text 出现的次数。
我试过这样查询:
select("cv.id, (CHAR_LENGTH(cve.responsibilities)
-
CHAR_LENGTH(REPLACE(LOWER(cve.responsibilities),LOWER(" . $text. "),'')))/CHAR_LENGTH(" . $text . ") AS count")
进入我在 symfony2 中的 queryBuilder。
我知道这种查询远非最佳,但我被迫这样做。
我在我的 functionNode 中添加了一个 replace 和 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);
}
使用 SQL 查询大数据总是比使用 DQL 更好,试试这样的方法:
LENGTH( cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '. $text.', '')) AS counts
这应该会为您提供现场职责中的计数或出现次数。
您可以将其添加到您的存储库中 class,调用并获取结果 我已经在我这边测试过了
public function getTested()
{
return $this->createQueryBuilder('cve')
->select("cve.id, (LENGTH(cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '". $text ."','')))/LENGTH('". $text ."')")
->getQuery()->getArrayResult();
}
此处 REPLACE 函数执行以下操作 link
Doctrine query - ignoring spaces
所以我无法使用
$qb->select('a.id,' . $expr->quot(':counter', ':denominator') . 'as count')
相反,我将名称从 'count' 更改为 'field',并删除了 'as'
$qb->select('a.id id,' . $expr->quot($counter, $denominator . ' field'))
我用过:replace class and regexp
并且有效。问题已解决
我需要找到一种方法来获取文本类型的职责字段中 $text 出现的次数。
我试过这样查询:
select("cv.id, (CHAR_LENGTH(cve.responsibilities)
-
CHAR_LENGTH(REPLACE(LOWER(cve.responsibilities),LOWER(" . $text. "),'')))/CHAR_LENGTH(" . $text . ") AS count")
进入我在 symfony2 中的 queryBuilder。
我知道这种查询远非最佳,但我被迫这样做。 我在我的 functionNode 中添加了一个 replace 和 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);
}
使用 SQL 查询大数据总是比使用 DQL 更好,试试这样的方法:
LENGTH( cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '. $text.', '')) AS counts
这应该会为您提供现场职责中的计数或出现次数。
您可以将其添加到您的存储库中 class,调用并获取结果 我已经在我这边测试过了
public function getTested()
{
return $this->createQueryBuilder('cve')
->select("cve.id, (LENGTH(cve.responsibilities) - LENGTH(REPLACE(cve.responsibilities, '". $text ."','')))/LENGTH('". $text ."')")
->getQuery()->getArrayResult();
}
此处 REPLACE 函数执行以下操作 link Doctrine query - ignoring spaces
所以我无法使用
$qb->select('a.id,' . $expr->quot(':counter', ':denominator') . 'as count')
相反,我将名称从 'count' 更改为 'field',并删除了 'as'
$qb->select('a.id id,' . $expr->quot($counter, $denominator . ' field'))
我用过:replace class and regexp
并且有效。问题已解决