【问题标题】:CakePHP - MySQL Order by CAST to INT not workingCakePHP - MySQL Order by CAST to INT 不起作用
【发布时间】:2022-02-17 08:38:44
【问题描述】:

使用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'
    )
);

但在 Query 输出中,它将 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 模型来完成,可能有什么问题?

非常感谢!

【问题讨论】:

    标签: php mysql cakephp pagination cakephp-2.x


    【解决方案1】:

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

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

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

    然后你通过Product.month_number订购。

    另见

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多