我一直在浪费太多时间试图解决有关 Phalcon/Paginator
与 QueryBuilder
一起用于特定查询的问题。在我尝试添加分页器之前,查询工作正常,而且分页器似乎正在中断查询。鉴于 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);
这是一个没有分页器的生成查询的例子;
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
rowcountFROM
分页器现在生成的查询是;
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);
更新
我在执行类似的查询时似乎遇到了完全相同的错误
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
FROMorder
' at line 1
我能够使用一种变通方法来解决这个问题。而不是使用 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
时似乎出现了问题。看这个open issue in Phalcon .
关于php - Phalcon Paginator 中断查询生成器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616016/