Ich habe zu viel Zeit zu verschwenden versucht, ein Problem zu beheben Phalcon/Paginator
mit QueryBuilder
für eine bestimmte Abfrage verwendet in Bezug auf. Die Abfrage funktioniert einwandfrei, bis ich versuche, den Paginator hinzuzufügen, und es scheint, dass der Paginator die Abfrage durchbricht. Da es in Phalcon einen Paginator gibt, den ich in diesem Projekt verwendet habe, wäre es falsch, dieses Problem zu umgehen, indem ich ein separates benutzerdefiniertes Paging-System für ein paar Abfragen erstelle! Ich würde das gerne zur Arbeit bringen.Phalcon Paginator Breaks Query Builder Abfrage
Hier ist die Baumeister;
$_ads = $this->modelsManager->createBuilder()
->columns($dist . ' AS distance, classifieds_ads.id AS id, classifieds_ads.title AS title, classifieds_ads.description AS description, classifieds_ads.city AS city, classifieds_ads.country AS country, classifieds_ads.latitude AS latitude, classifieds_ads.longitude AS longitude, classifieds_images.file AS image')
->addFrom('\Baseapp\Models\ClassifiedsAds', 'classifieds_ads')
->leftJoin('\Baseapp\Models\ClassifiedsImages', "classifieds_images.ad_id = classifieds_ads.id", 'classifieds_images')
->where($where)
->groupBy('classifieds_ads.id')
->having($having)
->orderBy($order);
Hier ist ein Beispiel der erzeugten Abfrage ohne paginator;
SELECT (3959 * acos(cos(radians(****)) * cos(radians(`classifieds_ads`.`latitude`)) * cos(radians(`classifieds_ads`.`longitude`) - radians(****)) + sin(radians(****)) * sin(radians(`classifieds_ads`.`latitude`)))) AS `distance`, `classifieds_ads`.`id` AS `id`, `classifieds_ads`.`title` AS `title`, `classifieds_ads`.`description` AS `description`, `classifieds_ads`.`city` AS `city`, `classifieds_ads`.`country` AS `country`, `classifieds_ads`.`latitude` AS `latitude`, `classifieds_ads`.`longitude` AS `longitude`, `classifieds_images`.`file` AS `image`
FROM `classifieds_ads` AS `classifieds_ads`
LEFT JOIN `classifieds_images` AS `classifieds_images` ON `classifieds_images`.`ad_id` = `classifieds_ads`.`id`
WHERE `classifieds_ads`.`status` = 'active' AND (`title` LIKE '%query%' OR `description` LIKE '%query%' OR `classifieds_ads`.`tags` LIKE '%query%')
GROUP BY `id`
HAVING `distance` <= 200
ORDER BY IF(`title` LIKE '%query%', 1, IF(`classifieds_ads`.`tags` LIKE '%query%', 2, IF(`description` LIKE '%query%', 3, 4)))
Dies funktioniert wie erwartet. Allerdings, wenn ich den Paginator hinzufüge;
$paginator = new \Phalcon\Paginator\Adapter\QueryBuilder(
array(
'builder' => $_ads,
'limit' => 5,
'page' => \Phalcon\DI::getDefault()->getShared('request')->getQuery('page', 'int')
)
);
$ads = $paginator->getPaginate();
Das gibt mir eine Fehlermeldung: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064....right syntax to use near ') AS
rowcount FROM
Die Abfrage, die paginator jetzt erzeugt ist;
SELECT COUNT() AS `rowcount`
FROM `classifieds_ads` AS `classifieds_ads`
LEFT JOIN `classifieds_images` AS `classifieds_images` ON `classifieds_images`.`ad_id` = `classifieds_ads`.`id`
WHERE `classifieds_ads`.`status` = 'active' AND (`classifieds_ads`.`title` LIKE '%query%' OR `classifieds_ads`.`description` LIKE '%query%' OR `classifieds_ads`.`tags` LIKE '%query%')
HAVING `classifieds_ads`.`distance` <= 200
Es scheint, dass SELECT COUNT()
die Abfrage bricht und auch die Abfrage ist jetzt unvollständig! Ich habe das Gefühl, das könnte daran liegen, dass ich SELECT table.field AS xxx
in columns()
verwendet habe.
Ich bin nicht sicher, ob dieses unerwartete Verhalten ein Bug ist oder vielleicht etwas, das ich mit Blick auf. Irgendwelche Ideen?
Überprüfen Sie meine Antwort aktualisiert! – Timothy