【问题标题】:kohana ORM questionkohana ORM 问题
【发布时间】:2025-12-22 11:55:12
【问题描述】:

我正在使用 kohana ORM 从数据库中获取一些结果。我的问题是:即使我查阅了文档,我也找不到只选择我感兴趣的列的方法。更明确地说,我有:

$sale_stock = Model::factory('product_type')
->where('product_type_id','=', $id )
-> find_all();

var 转储它,它选择了我所有的“SELECT product_type.* from product_type where etc”。 但我只想从 salestock 表中选择“库存”字段。做 find('stock') 而不是 find_all() 返回一个奇怪的对象...我哪里错了,我如何才能使用 kohana orm 仅选择列 'stock'?

谢谢!

【问题讨论】:

    标签: orm select kohana


    【解决方案1】:

    ORM 方法find()find_all() 总是选择所有表列,因此有两种方法获取指定字段:

    • 加载完整的表行并获取列 来自它:
    $sale_stock = Model::factory('product_type')
       ->where('product_type_id','=', $id )
       -> find_all();
    // get array of id=>stock values
    $columns = $sale_stock->as_array('id', 'stock');
    
    • 在模型中使用创建特殊方法 查询生成器:
    // model Model_Product_Type 
    public function get_stocks($product_type_id) 
    {    
       return DB::select(array('stock'))
          ->from($this->_table_name)
          ->where('product_type_id', '=', $product_type_id)
          ->execute($this->_db); 
    }
    

    【讨论】:

      【解决方案2】:

      我知道这不是您要找的,但我从 Kohana 文档中提取了以下内容...

      $articles = ORM::factory('article')->select_list('id', 'title');
      
      foreach ($articles as $id => $title)
      {
          // Display a list of links
          echo html::anchor('articles/'.$id, $title);
      }
      
      // Display a dropdown list
      echo form::dropdown('articles', $articles);
      

      您可以将其视为折扣,一个价格的两个字段。

      当请求部分模型或合并模型字段时,ORM 通常会返回“非标准”对象。这可以防止使用原始对象进行混淆操作(即,当对象仅包含 8 个字段中的 2 个时,如何保存对象,以及可能来自另一个模型的一些字段?)。

      如果你 print_r 对象,并告诉我它的外观......它可能正是你想要的。

      【讨论】:

      • 由于某些原因 select_list 不适用于我的查询,它给了我:无效方法错误。
      • 你说得对,这是 Kohana 2 方法。我失败了。我查看了 ORM 类的源代码,似乎没有任何地方支持部分选择。要么直接使用模型,没有 ORM,要么修改/添加到 ORM 功能似乎是必需的。
      • 是的.. 很奇怪。我将在模型中编写一个选择函数(使用 sql)我想这是最简单的方法。谢谢你! :)
      【解决方案3】:

      我知道这是一个老问题,但我找到了可能更简单的解决方案:

      $sale_stock = ORM::factory('product_type')
         ->where( 'product_type_id','=', $id )
         ->find_all();
      die($sale_stock->stock);
      

      【讨论】: