php - Phalcon Paginator 中断查询生成器查询

标签 php mysql pdo pagination phalcon

我一直在浪费太多时间试图解决有关 Phalcon/PaginatorQueryBuilder 一起用于特定查询的问题。在我尝试添加分页器之前,查询工作正常,而且分页器似乎正在中断查询。鉴于 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 ') ASrowcountFROM

分页器现在生成的查询是;

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 FROM order' 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 byQueryBuilderPaginator 时似乎出现了问题。看这个open issue in Phalcon .

关于php - Phalcon Paginator 中断查询生成器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616016/

相关文章:

php - 使用 php 从具有多个参数(来自不同列)的 mysql 表中查找行

php - PHP 准备语句中的问号不起作用?

php - 解析错误 : syntax error, 意外 '$_GET' (T_VARIABLE)

php - 仅当名称唯一时才将 csv 上传到 mysql(如果不存在则创建)

javascript - 动态更改表单操作?

php - 如何在 PHP 中解析 ffmpeg 信息?

mysql - 如何在 MYSQL 中编写此 GROUP BY 查询?

php - 如果数据库列为空 symfony 2,则过滤数组

php - 是否可以触发数据库更改并在 Laravel 中触发事件?

php - MySQL PDO 计数函数返回不正确的多个 WHERE 条件