[英]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
FROMorder
'附近使用正確的語法
我能夠使用解決方法來解決這個問題。 而不是使用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 by
, QueryBuilder
和Paginator
時似乎存在問題。 請參閱Phalcon中的這個未解決的問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.