MATCH ACTION脚本不适用于Symfony2


MATCH AGAINST script is not working with Symfony2

我试图在我的Symfony2项目中设置这个类:http://xlab.pl/en/full-text-searching/(与零件匹配)

这门课应该允许我使用像这样的原则来对抗比赛:

$searchResult =      $em->createQueryBuilder('uvaluo_user')
                                ->addSelect("MATCH_AGAINST (uvaluo_user.firstname, uvaluo_user.lastname, :name 'IN NATURAL MODE') as score")
                                ->add('where', 'MATCH_AGAINST (uvaluo_user.firstname, uvaluo_user.lastname, :name) > 0.8')
                                ->setParameter('name', $name)
                                ->getQuery()
                                ->getResult();

正如他们在网站上所说,我把它放在我的应用程序的config.yml中:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    auto_mapping: true
    dql:
      string_functions:
        match_against: Uvaluo'UserBundle'Extension'Doctrine'MatchAgainstFunction

我有类MatchAgainstFunction,像这个

<?
namespace Uvaluo'UserBundle'Extension'Doctrine;
use Doctrine'ORM'Query'Lexer;
use Doctrine'ORM'Query'AST'Functions'FunctionNode;
/**
 * @example by https://gist.github.com/1234419 Jérémy Hubert 
 * "MATCH_AGAINST" "(" {StateFieldPathExpression ","}* InParameter {Literal}? ")"
 */
class MatchAgainstFunction extends FunctionNode {
//Content that I got in the website
}

最后,当我尝试我的代码时,我得到了以下错误:

[语义错误]第0行,第107列,靠近"MATCH_AGAINST":错误:未定义类"MATCH _AGANST"。500内部服务器错误-QueryException1链接异常:QueryException»

你知道这可能是什么原因吗?

基于本文扩展条令2中的DQL:用户定义函数:

config.yml:

doctrine:
  orm:
    dql:
      string_functions:
        MATCH: My'Bundle'DQL'MatchAgainstFunction

MatchAgainstFunction.php

<?php
namespace My'Bundle'DQL;
use Doctrine'ORM'Query'AST'Functions'FunctionNode;
use Doctrine'ORM'Query'Lexer;
use Doctrine'ORM'Query'Parser;
use Doctrine'ORM'Query'SqlWalker;
/**
 * MatchAgainstFunction ::=
 *  "MATCH" "(" StateFieldPathExpression {"," StateFieldPathExpression}* ")" "AGAINST" "("
 *      StringPrimary ["BOOLEAN"] ["EXPAND"] ")"
 */
class MatchAgainstFunction extends FunctionNode {
  /** @var array list of 'Doctrine'ORM'Query'AST'PathExpression */
  protected $pathExp = null;
  /** @var string */
  protected $against = null;
  /** @var boolean */
  protected $booleanMode = false;
  /** @var boolean */
  protected $queryExpansion = false;
  public function parse(Parser $parser) {
    // match
    $parser->match(Lexer::T_IDENTIFIER);
    $parser->match(Lexer::T_OPEN_PARENTHESIS);
    // first Path Expression is mandatory
    $this->pathExp = array();
    $this->pathExp[] = $parser->StateFieldPathExpression();
    // Subsequent Path Expressions are optional
    $lexer = $parser->getLexer();
    while ($lexer->isNextToken(Lexer::T_COMMA)) { 
      $parser->match(Lexer::T_COMMA); 
      $this->pathExp[] = $parser->StateFieldPathExpression(); 
    }
    $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    // against
    if (strtolower($lexer->lookahead['value']) !== 'against') {
      $parser->syntaxError('against');
    }
    $parser->match(Lexer::T_IDENTIFIER);
    $parser->match(Lexer::T_OPEN_PARENTHESIS);
    $this->against = $parser->StringPrimary();
    if (strtolower($lexer->lookahead['value']) === 'boolean') {
      $parser->match(Lexer::T_IDENTIFIER);
      $this->booleanMode = true;
    }
    if (strtolower($lexer->lookahead['value']) === 'expand') {
      $parser->match(Lexer::T_IDENTIFIER);
      $this->queryExpansion = true;
    }
    $parser->match(Lexer::T_CLOSE_PARENTHESIS);
  }
  public function getSql(SqlWalker $walker) {
    $fields = array();
    foreach ($this->pathExp as $pathExp) {
      $fields[] = $pathExp->dispatch($walker);
    }
    $against = $walker->walkStringPrimary($this->against)
        . ($this->booleanMode ? ' IN BOOLEAN MODE' : '')
        . ($this->queryExpansion ? ' WITH QUERY EXPANSION' : '');
    
    return sprintf('MATCH (%s) AGAINST (%s)', implode(', ', $fields), $against);
  }
}

在您的存储库中:

class MyRepository extends EntityRepository
{
    
    public function getUsingAgainstMatch() {
        $qb = $this->getEntityManager()->createQueryBuilder();
        $qb
            ->select('m')
            ->from('MyBundle:MyEntity', 'm')
            ->andWhere('MATCH (m.field) AGAINST (:field) > 1')
            ->setParameter('field', 'value')
        ;
        return $qb;
    }
    //...
}

你可以在这个存储库中找到很多条令扩展。

希望这能帮助

您可以通过在composer中要求"beberlei/DoctrineExtensions":"^1.0",来安装doctrineExtensions。然后您将拥有大量mysql函数以及Match,然后您可以在querybuilder或自定义查询中的where子句中使用Match函数,而不会有任何问题。

安装捆绑包后,您需要转到配置文件并添加所需的功能

doctrine:
   .
   .
   .
    orm:
    .
    .
    .
       dql:
           string_functions:
                MATCH: DoctrineExtensions'Query'Mysql'MatchAgainst