【问题标题】:Kohana ORM orderingKohana ORM 订购
【发布时间】:2015-08-12 12:40:34
【问题描述】:

我正在使用 Kohana 的 ORM 库,我想知道是否有任何方法可以按特定的预定顺序选择数据库记录。

$products_ids = array('5', '6', '1', '33', '2');

$products = ORM::factory('Product')->where('state', '=', 1)
->and_where('id', 'IN', $products_ids)->find_all();

这按主键 (id) 排序结果。所以结果记录的顺序是 (1, 2, 5, 6, 33)。如何按 $products_ids ('5', '6', '1', '33', '2') 中定义的顺序选择记录?

谢谢。

【问题讨论】:

    标签: orm sql-order-by kohana


    【解决方案1】:

    是的,这是可能的。

    $products = ORM::factory('Product')->where('state', '=', 1) ->and_where('id', 'IN', $products_ids)->order_by('product_id', 'desc')->find_all();

    注意上面字符串中添加的order_by()。

    您现在可以订购结果。它有更多很酷的功能,例如group_by()。

    阅读文档,您会在 ORM 中发现更多意想不到的魔力。

    【讨论】:

    • 谢谢你的回答,拉蒙!我一直在使用 order_by。添加 ->order_by('product_id', 'desc') 将按顺序排列结果('33'、'6'、'5'、'2'、'1')。那不是我需要的。问题是如何按照 $products_ids ('5', '6', '1', '33', '2') 中定义的顺序对结果进行排序。
    • 嗯。在这种情况下,我会在数据库中添加一个“订单”作为列,然后您可以在该列中订购。让我知道你会怎么想。
    • 这将是一个解决方案,以防在我们构建数据库请求之前存储订单。在我的情况下(非标准情况),排序取决于每个用户的选择,并在统计数据收集中发挥关键作用。我从 POST 数据数组中订购产品,因此在提交表单之前订购是未知值。但也许这是一个场景问题。
    • 我知道这是一个糟糕的解决方案,但无论如何:
       $products_ids = array('5', '6', '1', '33', '2'); $products_object = ORM::factory('Product'); $products_ordered = 数组(); foreach($products_ids as $products_id) { $products_ordered[$products_id] = $products_object->where('id', '=', $products_id)->find(); } 
    • 我稍后会检查这个:)
    【解决方案2】:

    在 MySQL 中,您可以按子句顺序设置条件,如果条件匹配,则将其视为 1 和 0 失败。

    示例代码如下:

    $products_ids = array('5', '6', '1', '33', '2');
    
    $products = ORM::factory('Product')->where('state', '=', 1)->and_where('id', 'IN', $products_ids);
    foreach($products_ids as $product_id)
    {
        $products->order_by(DB::expr('id='.$product_id), 'desc');
    }
    $products = $products->find_all();
    

    在 MySQL 中它看起来像这样:

    SELECT * FROM products WHERE ... ORDER BY id=5 DESC, id=6 DESC, id=1 DESC, id=33 DESC, id=2 DESC;
    

    【讨论】:

      【解决方案3】:

      我不知道你为什么要做这么愚蠢的事情,但你有 2 个答案。 (对于严格的问题。但可能你没有显示完整的背景。

      我提出2个场景:

      1. 页面类别中的产品 - 添加列以将其添加到表中。
      2. 显示购物图表 - 按 order_item_id 排序

      顺便说一句:ORM 很舒服,但速度很慢,所以如果您只为显示(读取操作)使用它,最好使用原始查询。这里是 ORM 的解决方案。

      public function get_ordered(array $ids){
        if(empty($ids))
          return array();
        $res = DB::select->from($this->_table_name)
                 ->where($this->primary_key(),'IN',$ids)
              ->execute($this->_db)->as_array($this->primary_key());
        $out = array();
        foreach($ids AS $one){
          if(isset($res[$one]))
             $out[$one] = $res[$one];
        }
        return $out;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        • 2012-12-11
        • 2011-10-23
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多