簡體   English   中英

Phalcon Paginator打破查詢生成器查詢

[英]Phalcon Paginator Breaks Query Builder query

我一直在浪費太多時間來解決與QueryBuilder用於特定查詢的Phalcon/Paginator問題。 查詢工作正常,直到我嘗試添加分頁器,似乎分頁器打破了查詢。 看到Phalcon中內置了一個分頁器,我在整個項目中都使用過它,通過創建一個單獨的自定義分頁系統來解決這個問題似乎是錯誤的! 所以我想讓這個工作。

這是建設者;

$_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);

這是沒有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)))

這按預期工作。 但是,當我添加分頁符時;

$paginator = new \Phalcon\Paginator\Adapter\QueryBuilder(
        array(
            'builder' => $_ads,
            'limit' => 5,
            'page' => \Phalcon\DI::getDefault()->getShared('request')->getQuery('page', 'int')
        )
    );
    $ads = $paginator->getPaginate();

這給了我一個錯誤: PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064....right syntax to use near ') AS rowcount FROM

paginator現在生成的查詢是;

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

似乎SELECT COUNT()打破了查詢,而且查詢現在還不完整! 我有一種感覺,這可能是因為我在columns()使用了SELECT table.field AS xxx

我不確定這種意外行為是否是一個錯誤,或者我可能忽略了一些東西。 有任何想法嗎?

$_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

執行類似的查詢時,我似乎得到了完全相同的錯誤

SQLSTATE [42000]:語法錯誤或訪問沖突:1064 SQL語法中有錯誤; 查看與您的MySQL服務器版本對應的手冊, order在第1行的') rowcount FROM order '附近使用正確的語法

我能夠使用解決方法來解決這個問題。 而不是使用QueryBuilder作為數據:

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

我使用結果集作為數據:

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

經過進一步的研究,在使用group byQueryBuilderPaginator時似乎存在問題。 請參閱Phalcon中的這個未解決的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM