【问题标题】:Kohana 3.2 ORM with columns based on DB::expr()Kohana 3.2 ORM 的列基于 DB::expr()
【发布时间】:2012-04-18 14:36:32
【问题描述】:

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

【问题讨论】:

    标签: kohana kohana-3 kohana-orm


    【解决方案1】:

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

    1. 身份证
    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数组中。

    【讨论】:

    • 听起来很有希望。而且我可以同时删除完整的列查询,减少一些无关的数据库查询。 ;) 那么我该如何将DB::expr() 调用传递给最初加载模型的查询呢?或者这只是为了当我在实际表中有一个排序列时?
    • 我不太明白您所说的“我如何将 DB::expr() 调用传递给最初加载模型的查询”是什么意思。您的查询应该保持完全相同,但您可以使用新列进行排序。
    • 我最初想做的是在加载 orm 模型的查询中的原始问题中包含 case 语句,而不是有一个带有可排序名称的额外列。
    猜你喜欢
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多