CakePHP - MySQL按CAST到INT排序不起作用

eufgjt7s  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(134)

使用CakePHP 2.xMySQL 5.6.40,我将创建以下分页:

$options = array(
    'contain' => array(
        'Category',
        'ProductImage'
    ),
    'limit' => 10,
    'order' => array(
        'Product.year' => 'DESC',
        'Product.month' => 'DESC'
    )
);

但是我忘记了我的products.month列是varchar,所以我必须进行一次转换,将products.month转换为integer:

$options = array(
    'contain' => array(
        'Category',
        'ProductImage'
    ),
    'limit' => 10,
    'order' => array(
        'Product.year' => 'DESC',
        'CAST(Product.month as INT)' => 'DESC'
    )
);

但在查询输出中,它会将Order By CAST作为INT删除

SELECT
    ...
FROM
    `web_quality`.`products` AS `Product`
LEFT JOIN `web_quality`.`categories` AS `Category` ON (
    `Product`.`category_id` = `Category`.`id`
)
WHERE
    `Product`.`category_id` IN (
        SELECT
            id
        FROM
            categories
        WHERE
            tag = 'revistas'
        AND company_id IN (
            SELECT
                id
            FROM
                companies
            WHERE
                tag = 'dr'
        )
    )
AND NOT (
    (
        (`Product`.`year` = '2022')
        AND (`Product`.`month` = '2')
    )
)
AND `Product`.`enabled` = '1'
ORDER BY
    `Product`.`year` DESC,
LIMIT 10

它也不会产生任何类型的错误,如果我尝试手动查询与CAST作为INT它的工作,但我必须这样做使用CakePHP模型,什么可能是错误的?
非常感谢!

ekqde3dh

ekqde3dh1#

在我的记忆中,您应该使用虚拟字段,因为分页器会检查给定字段是否存在于模型中,而将SQL片段列入白名单似乎不是一个好主意。
在你的模型中,你可以这样做:

public $virtualFields = array(
    'month_number' => 'CAST(Product.month as INT)',
);

然后按Product.month_number订购。
另请参阅


*Cookbook〉核心库〉组件〉分页〉控制用于排序的字段

相关问题