Doctrine 2 – syntax error u funkce MATCH-AGAINST

Daewoo
Člen | 33
+
+1
-

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
+
0
-

dql neni sql a nepodporuje vsechny konstrukce sql. pro ruzne veci musis mit napriklad custom dql funkce, viz hned prvni vysledek v google

Daewoo
Člen | 33
+
0
-

Právě proto mám od nějakého Brbláka instalované „beberlei/DoctrineExtensions“: „^1.0“, které custom dql fce řeší.

Editoval Daewoo (7. 6. 2017 10:43)

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
+1
-

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
+
0
-

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
+
0
-

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*')
Daewoo
Člen | 33
+
0
-

Vyhodí:

Doctrine\ORM\Query\QueryException

[Syntax Error] line 0, col -1: Error: Expected =, <, <=, <>, >, >=, !=, got end of string.
David Matějka
Moderator | 6445
+
+2
-

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")
Daewoo
Člen | 33
+
0
-

Jsi King! Děkuju! Taková blbost!