Doctrine 2 – syntax error u funkce MATCH-AGAINST
- Daewoo
- Člen | 33
Ahoj,
snažím se rozběhnout pod Doctrine 2 fulltext vyhledávání. Kód:
$this->articles->getEntityManager()->getConfiguration()->addCustomStringFunction('MATCH', 'DoctrineExtensions\Query\Mysql\MatchAgainst');
$query = $this->articles->createQueryBuilder("p")->select("p")->where("MATCH ('name', 'meta_title', 'description', 'meta_description') AGAINST ('test*')")setFirstResult($offset)->setMaxResults($limit);
Vyhodí to při procházení výsledku ve foreach tohle:
Doctrine\ORM\Query\QueryException
[Syntax Error] line 0, col -1: Error: Expected =, <, <=, <>, >, >=, !=, got end of string.
Přitom DQL je, zdá se, správně:
SELECT p
FROM App\Model\Entity\Article p
WHERE MATCH ('name', 'meta_title', 'description', 'meta_description') AGAINST ('test*')
Prostředí:
"beberlei/DoctrineExtensions": "^1.0",
"nette/application": "^2.4",
"kdyby/doctrine": "^3.2"
Config:
extensions:
console: Kdyby\Console\DI\ConsoleExtension
events: Kdyby\Events\DI\EventsExtension
annotations: Kdyby\Annotations\DI\AnnotationsExtension
doctrine: Kdyby\Doctrine\DI\OrmExtension
doctrine:
user: %user%
password: %password%
dbname: %db%
auto_mapping: true
metadata:
App: %appDir%
Kde dělám chybu? Google bohužel moc nepomohl.
- David Matějka
- Moderator | 6445
dql neni sql a nepodporuje vsechny konstrukce sql. pro ruzne veci musis mit napriklad custom dql funkce, viz hned prvni vysledek v google
- David Matějka
- Moderator | 6445
v tom pripade to dle definice sql
vypada, ze syntaxe je nasledujici
->where("MATCH (p.name, p.meta_title, p.description, p.meta_description AGAINST :against)")
->setParameter('against', 'test*')
- Daewoo
- Člen | 33
Pokud tam ta závorka opravdu být nemá, dostanu:
[Syntax Error] line 0, col 110: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got 'AGAINST'
Jinak s ní je to beze změny – myslím ale, že jsem to už zkoušel. Ta syntaxe by fungovat měla, lidi s ní normálně pracujou a nikdo nic nehlásí, co se tak na netu dívám.
- David Matějka
- Moderator | 6445
jo ty asi tu funkci nemas registrovanou, zkus do configu pod doctrine sekci pridat
dql:
string:
match: DoctrineExtensions\Query\Mysql\MatchAgainst
Ta syntaxe by fungovat měla, lidi s ní normálně pracujou a nikdo nic nehlásí, co se tak na netu dívám.
kde si to cet, ze to lidi pouzivaji a funguje?
- Daewoo
- Člen | 33
David Matějka napsal(a):
jo ty asi tu funkci nemas registrovanou, zkus do configu pod doctrine sekci pridat
dql: string: match: DoctrineExtensions\Query\Mysql\MatchAgainst
Ta syntaxe by fungovat měla, lidi s ní normálně pracujou a nikdo nic nehlásí, co se tak na netu dívám.
kde si to cet, ze to lidi pouzivaji a funguje?
Tu registraci by mělo zajišťovat:
$this->trips->getEntityManager()->getConfiguration()->addCustomStringFunction('MATCH', 'DoctrineExtensions\Query\Mysql\MatchAgainst');
Do configu jsem to zkoušel přidat už dřív (ale nebyl jsem si jistý, jestli to jede v pořádku), teď teda i podle tebe (a najde ji), ale dostanu se zpátky na Error: Expected =, <, <=, <>, >, >=, !=,…
Jinak – ono to asi nějak funguje s vlastní napsanou fcí (něco jsem zkoušel, ale furt se to na něčem se*e), na netu jsem našel pár článků udělej si sám, ale koukám, že pod Symfony (velký rozdíl by ale asi být neměl). K nějakým … „specificky konkrétním“ účelům to pojede, ale jakmile někdo něco pozmění, spadne to.
Přemýšlím, že se na to vybodnu. Je nějaká snadnější možnost, jak poskládat SQL dotaz ručně, do Doctrine bez DQL ho nacpat natvrdo a namapovat výsledek do entit? Zřejmě je to zabugovaný a předpokládám, že nikdo z nás nemá čas se v tom nějak víc rejsnit.
- David Matějka
- Moderator | 6445
ne, sorry, mel si pravdu, ta zavorka by tam mela byt. mozna tedy oproti tvemu puvodnimu reseni tam jen mely byt jine parametry u match.. zkus teda
->where("MATCH (p.name, p.meta_title, p.description, p.meta_description) AGAINST (:against)")
->setParameter('against', 'test*')
- David Matějka
- Moderator | 6445
uz jsem to objevil! jediny problem je v tom, ze to vraci relevanci, takze tam musis dat porovnani:
->where("MATCH (p.name, p.meta_title, p.description, p.meta_description) AGAINST (:against) > 0")