CakePHP - MySQL 按 CAST 到 INT 的排序不工作
CakePHP - MySQL Order by CAST to INT not working
使用 CakePHP 2.x
和 MySQL 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
.
之前订购
另见
使用 CakePHP 2.x
和 MySQL 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
.
另见