DQL query (great circle distance)
Ik heb de laatste tijd al wat vragen gesteld over symfony en dergelijke en ben nu met me laatste stukje bezig.
Ik heb een tabel met leerlingen naw gegevens. Hierin sla ik ook de Latitude en Longitude op (die haal ik op via de google api en dat gaat goed). Nu wil ik graag een query maken waarin ik namen van leerlingen ophaal binnen een bepaalde cirkel. Nu heb ik zo'n functie al is eerder gemaakt (zonder symfony) en probeer nu deze code te hergebruiken alleen loop ik tegen het probleem op dat ik de query niet goed uitgevoerd krijg.
De query die ik probeer te maken is het volgende (normaliter moeten bij de normale waarden die zijn ingevoerd natuurlijk parameters worden ingevoerd maar omdat ik even aan het testen ben of alles goed gaat heb ik ze handmatig ingevoerd)
<php
$dql = "
SELECT l.achternaam
FROM AppBundle:Leerling l
JOIN l.klas k
JOIN k.niveau n
WHERE (3959 * acos( cos( radians('52.1112102') ) * cos( radians( l.latitude ) )
* cos( radians( l.longitude )
- radians('5.0449914') )
+ sin( radians('52.1112102') )
* sin( radians( l.latitude ) ) ) < 75)";
?>
(Daarna voer ik hem natuurlijk uit en handel ik hem af net zoals ik al de andere queries afhandel. Mocht die code nuttig zijn om te zien zal ik hem later evt toevoegen)
Nu krijg ik een hele lange foutmelding als ik dit probeer uit te voeren. Waarvan het belangrijkste denk ik zijn 'Doctrine\ORM\Query\QueryException' en 'Doctrine\ORM\Query\QueryException::dqlError('SELECT l? ...')
Ik heb al een aantal dingen geprobeerd
- Getest of de 'JOINS' de foutmelding genereren dit is niet het geval want ie gingen gewoon goed (als ik het great circle distance formuletje weghaal)
- Ik heb de query 'apart' al in mysql getest en daar gaat ie goed (heb hem ook al in oude projecten gebruikt)
- In plaats van Kilomters miles geprobeerd te gebruiken maar dat heeft weinig effect.
- Om te testen een andere WHERE conditie geprobeerd (where l.naam = 'dijk') en dat ging ook goed.
Ik zit echt op dit moment vast waarom ik deze query niet werkend krijg en google geeft mij ook niet erg veel antwoorden. Kan iemand mij hier eventueel mee helpen?
alvast bedankt!
--edit quote aangepast (typo)--
Gewijzigd op 10/04/2015 11:09:22 door Ama saril
Dit zou eigenlijk een parse error op moeten leveren?
Heb je je query wel eens rechtstreeks aan je database gevoerd, zonder tussenkomst van Doctrine?
Ik had hem inderdaad al uitgevoerd in de database en daar werkt ie (Het quotje wat in jouw bericht verkeerd staat heb ik denk ik in het forum verkeerd geplaatst.
Hoe luidt de volledige foutmelding?
Kun je meer code laten zien van hoe de query daadwerkelijk wordt uitgevoerd (je laat alleen de query-string zien in je codefragment)?
De volledige foutmelding komt altijd neer op deze (staat heel vaak onder elkaar)
Code (php)
1
2
2
'Doctrine\ORM\Query\QueryException' with message 'SELECT l.achternaam FROM AppBundle:Leerling l JOIN l.klas k
JOIN k.niveau n WHERE (3959 * acos( cos( radians('52.1112102') ) * cos( radians( l.latitude ) ) * cos( radians( l.longitude ) - radians('5.0449914') ) + sin( radians('52.1112102') ) * sin( radians( l.latitude ) ) ) < 75)' C:\xampp\htdocs\TestProjecten\leerlingproject\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php:41'
JOIN k.niveau n WHERE (3959 * acos( cos( radians('52.1112102') ) * cos( radians( l.latitude ) ) * cos( radians( l.longitude ) - radians('5.0449914') ) + sin( radians('52.1112102') ) * sin( radians( l.latitude ) ) ) < 75)' C:\xampp\htdocs\TestProjecten\leerlingproject\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php:41'
Code (php)
1
Next exception 'Doctrine\ORM\Query\QueryException' with message '[Syntax Error] line 0, col 224: Error: Expected known function, got 'acos'' in C:\xampp\htdocs\TestProjecten\leerlingproject\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php:52
De query wordt alsvolgt uitgevoerd (ik heb al meerdere functies op dezelfde manier gemaakt die wel goed. Als ik zegmaar het where statement verander naar "WHERE l.achternaam = 'dijk'" dan doet hij het gewoon helemaal goed en krijg ik de resultaten die ik wil
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$dql = "SELECT l.achternaam
FROM AppBundle:Leerling l
JOIN l.klas k
JOIN k.niveau n
WHERE (3959 * acos( cos( radians('52.1112102') ) * cos( radians( l.latitude ) )
* cos( radians( l.longitude )
- radians('5.0449914') )
+ sin( radians('52.1112102') )
* sin( radians( l.latitude ) ) ) < 75)";
$query = $this->getEntityManager()->createQuery($dql)
->setMaxResults(10);
$paginas = new Paginator($query, $fetchJoinCollection = true);
return $paginas;
FROM AppBundle:Leerling l
JOIN l.klas k
JOIN k.niveau n
WHERE (3959 * acos( cos( radians('52.1112102') ) * cos( radians( l.latitude ) )
* cos( radians( l.longitude )
- radians('5.0449914') )
+ sin( radians('52.1112102') )
* sin( radians( l.latitude ) ) ) < 75)";
$query = $this->getEntityManager()->createQuery($dql)
->setMaxResults(10);
$paginas = new Paginator($query, $fetchJoinCollection = true);
return $paginas;
-- code tag geplaatst --
Gewijzigd op 10/04/2015 11:29:38 door ama saril
Toevoeging op 10/04/2015 14:29:38:
Ik post hier even mijn oplossing voor het geval anderen tegen hetzelfde aanlopen.
Ik heb de benodigde extensies van de volgende locatie gehaald:
https://github.com/beberlei/DoctrineExtensions
Dat zijn dus de acos, cos, sin en radians functies.
Deze heb ik onder mijn appBundle in een folder geplaatst (DoctrineExtensions\Query\Mysql)
in autoload.php (in de map /app) heb ik de volgende regels toegevoegd:
Code (php)
1
2
3
4
2
3
4
$classLoader = new \Doctrine\Common\ClassLoader(
'DoctrineExtensions', __DIR__."/../src/AppBundle"
);
$classLoader->register();
'DoctrineExtensions', __DIR__."/../src/AppBundle"
);
$classLoader->register();
En als laatste heb ik de bestanden geregistreerd in het config.yml bestand (onder orm):
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
dql:
datetime_functions:
numeric_functions:
acos: DoctrineExtensions\Query\Mysql\Acos
cos: DoctrineExtensions\Query\Mysql\Cos
radians: DoctrineExtensions\Query\Mysql\Radians
sin: DoctrineExtensions\Query\Mysql\Sin
string_functions:
datetime_functions:
numeric_functions:
acos: DoctrineExtensions\Query\Mysql\Acos
cos: DoctrineExtensions\Query\Mysql\Cos
radians: DoctrineExtensions\Query\Mysql\Radians
sin: DoctrineExtensions\Query\Mysql\Sin
string_functions:
Bedankt voor de hulp!