php-MATCHAGAINSTスクリプトが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
}
最後に、コードを試してみると、次のエラーが発生します:
[Semantical Error] line 0、col 107 near'MATCH_AGAINST':Error:Class'MATCH_AGAINST' isnotdefined。 500内部サーバーエラー-QueryException 1つのリンクされた例外:QueryException»
その理由を知っていますか?
答え :
解決策:
この記事に基づくDoctrine2での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;
}
//...
}
このリポジトリには多くのDoctrineExtensionsがあります。
これがお役に立てば幸いです
答え :
解決策:
コンポーザーに"beberlei/DoctrineExtensions":"^1.0",
を要求することで、doctrineExtensionsをインストールできます。そうすれば、たくさんのmysql関数と Match ができ、querybuilderまたはカスタムクエリのwhere句でmatch関数を問題なく使用できます。
バンドルをインストールした後、構成ファイルに移動して必要な機能を追加する必要があります
doctrine:
.
.
.
orm:
.
.
.
dql:
string_functions:
MATCH: DoctrineExtensions\Query\Mysql\MatchAgainst
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。