Kohana 3.2 ORM,基于DB :: expr()的列

时间:2012-04-18 14:36:33

标签: kohana kohana-3 kohana-orm

在我当前的应用程序中,我有一个播放列表,它几乎普遍按查询中的播放名称排序。目前,它仅使用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调用中使用?或者我只需要创建一个包含名称的排序版本的实际列?

1 个答案:

答案 0 :(得分:0)

有可能。您需要设置$_table_columns数组以反映所有列,但“假”列。假设该表有3列:

  1. ID
  2. 名称
  3. 描述
  4. 在您的模型中,您应该覆盖$_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()

    这样,save方法也会忽略description列,因为它没有在$_table_columns数组中列出。