【问题标题】:CakePHP Find - Order By String-To-Int?CakePHP 查找 - 按字符串到整数排序?
【发布时间】:2010-09-22 17:18:20
【问题描述】:

我想使用 CakePHP 从数据库中提取一组照片,按照片标题排序 (0, 1, 2, 3...) 我的查询目前看起来像:

$ss_photos = $this->Asset->find('all',array(
  'conditions'=>array('kind'=>'photo'), 
  'order'=>'title'
));

不幸的是,标题似乎是字符串格式,导致排序顺序不理想(2.jpg 在 19.jpg 之后,等等)。在这种类型的 Cake 查询中,有没有一种快速的方法将 'title' 转换为 int 以用于排序目的?

【问题讨论】:

  • 注:它们是 $ss_photos 是因为它们注定要在幻灯片中使用,而不是因为它们描绘了纳粹“Schutzstaffel”成员。有时,明确这些事情很重要。
  • 你可以使用CAST()CONVERT()
  • ORDER BY CAST(title AS INT) 或类似的可能会在 MySQL 中工作,只是在思考如何最好地将其集成到 CakePHP 查询中!

标签: mysql cakephp


【解决方案1】:

不确定这是否是“推荐做法”,但在第一次通过时,它似乎有效:

$ss_photos = $this->Asset->find('all',array(
    'conditions'=>array('kind'=>'photo'), 
    'order'=>'Asset.title + 0'
));

有什么意见吗?

【讨论】:

  • 'order' => 'CAST(title AS INT)' 也很好用,但是(我在部署代码后才发现)仅适用于 MySQL 5.6 或同等版本。在旧版本上使用 CAST AS SIGNED
【解决方案2】:

解决方案是在您的示例图像名称中创建一个负责订单的隐藏列:00002.jpg、00019.jpg - 这样订单才能正常工作。

如果结果不是太多,我认为用 PHP 对它们进行排序会更容易(如果你当然使用它:))看到这个natsort()你只需要提取图像列表并对其进行排序。

【讨论】:

  • 如果在我的查询过程中 Cake 在重铸类型时遇到问题,在 PHP 中排序确实是最省力的解决方案...
猜你喜欢
  • 2019-01-13
  • 2023-03-26
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多