0

在我当前的应用程序中,我有一个剧本列表,它几乎普遍按查询中的剧本名称排序。目前,它是简单地使用DB::select()语句构建的,但是当我们进行大量重构时,我们想开始使用 Kohana 的 ORM 库。问题出在我们通常不按实际剧名排序,而是按经过处理的版本,去掉文章等并按此排序(因此摩尔门经出现在 Bs 旁边,而不是TS)。我不知道如何将其转移到 ORM 模型定义中。

选择代码如下所示(删节):

DB::select(column, column,
        DB::expr("CASE WHEN SUBSTRING_INDEX(show_name, ' ', 1) IN ('a', 'an', 'the')
              THEN SUBSTRING(show_name, INSTR(show_name, ' ') + 1)
              ELSE show_name
              END AS show_name_sort")

有没有办法创建一个假的 show_name_sort 列,Kohana 在保存时会忽略它,但我仍然可以在order_by通话中使用它?还是我只需要创建一个实际的列,其中包含名称的排序版本?

4

1 回答 1

0

有可能的。您需要设置$_table_columns数组以反映除“假”列之外的所有列。假设表有 3 列:

  1. ID
  2. 姓名
  3. 描述

在您的模型中,您应该覆盖$_table_columns,因此 ORM 不会依赖 SHOW FULL COLUMNS 查询:

class Model_Yourmodel extends ORM
{
    protected $_table_columns = array(
            'id' => '',
            'name' => '',
        );

示例查询可能如下所示:
ORM::factory('yourmodel')->order_by('description')->find_all()

这种方式也保存方法将忽略该description列,因为它没有列在$_table_columns数组中。

于 2012-04-19T07:12:41.983 回答