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/

相关文章:

javascript - 在不破坏内联 Javascript 的情况下缩小 HTML 代码

mysql - LEFT OUTER JOIN,左表没有重复项

javascript - 使用PHP switch控制语句列出MySQL数据库中的每个表列和行

c# - 在将文本框提交到数据库之前无法删除不必要的空格 C#

php - 未定义的 fetchAll 并在返回的 PDOStatement 中获取

php - Laravel 中 View::make 的返回类型是什么?

php - Jquery Qtip 的奇怪问题,第一次鼠标悬停后工具提示无法正常工作

PHP PDO 查找 UPDATE 的已找到行

php - Pdo select语句不显示数据库中的数据

php - 使用 PHP 进行非阻塞 SFTP/FTPS 上传?