2016-06-03 8 views
1

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?

+0

Überprüfen Sie meine Antwort aktualisiert! – Timothy

Antwort

0
$_ads = $this->modelsManager->createBuilder() 
      ->columns([ 
       'distance' => $dist, 
       'id'   => 'classifieds_ads.id', 
       'title'  => 'classifieds_ads.title', 
       'description' => 'classifieds_ads.description', 
       'city'  => 'classifieds_ads.city', 
       'country'  => 'classifieds_ads.country', 
       'latitude' => 'classifieds_ads.latitude', 
       'longitude' => 'classifieds_ads.longitude', 
       'image'  => 'classifieds_images.file', 
      ]) 
      ->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); 

UPDATE

ich scheine genau die gleichen Fehler zu bekommen, wenn eine ähnliche Abfrage

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS rowcount FROM order ' at line 1

ich in der Lage der Ausführung war eine Abhilfe zu verwenden, um dies zu lösen. Anstatt die Querybuilder als Daten:

$paginator = new Phalcon\Paginator\Adapter\QueryBuilder(["builder" => $_ads, "limit" => 4, "page" => 1]); 

ich die resultset als Daten verwenden:

$resultset = $_ads->getQuery()->execute(); 
$paginator = new Phalcon\Paginator\Adapter\Model(["data" => $resultset, "limit" => 4, "page" => 1]); 

Nach weiterer Erforschung, es ein Problem zu sein scheint, wenn group by Verwendung QueryBuilder und die Paginator zusammen. Siehe hierzu open issue in Phalcon.

+0

Ja, ich tat das schon, aber es machte keinen Unterschied. – Ally

+0

@Ally, haben Sie immer noch Probleme mit diesem Problem, oder haben Sie es geschafft, es zu lösen? – Timothy

+0

Danke für Ihr Update. Ich habe es umgangen, indem ich rohe Abfragen anstelle des Abfrage-Generators verwendet habe und einen weiteren Paginator für diese erstellt habe. Es scheint, Abfrage-Generator und Paginator sind nicht zuverlässig, wenn sie für etwas anderes als ziemlich grundlegende Abfragen, die nicht mehrere Auswahlmöglichkeiten, Gruppen von usw. beinhalten! Ich glaube, ich habe Ihre Methode oben schon einmal versucht, hatte aber Probleme damit. Ich werde es vielleicht irgendwann nochmal versuchen, aber Query Builder scheint sehr begrenzt zu sein. – Ally