CakePHP - MySQL 按 CAST 到 INT 的排序不工作

CakePHP - MySQL Order by CAST to INT not working

使用 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,所以我必须进行转换以将 Product.month 转换为整数:

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

但是在查询输出中,它删除了 Order By CAST as 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 as INT 手动查询,它可以工作,但我必须使用 CakePHP 模型来完成,这可能是什么错误?

非常感谢!

根据我的记忆,您应该为此使用虚拟字段,因为分页器会检查给定字段是否存在于模型中,并且将 SQL 代码段列入白名单似乎不是一个好主意。

所以在你的模型中你会做这样的事情:

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

然后您在 Product.month_number.

之前订购

另见