2011-01-31 1 views
4

У меня есть эти две модели:Kohana ORM пользовательские методы в модели

 
class Model_user extends ORM { 
    protected $_has_many = array('credits', array('model'=>'credit', 'foreign_key'=>'user')); 
} 

class Model_credit extends ORM { 
    protected $_belongs_to = array('user', array('model'=>'user', 'foreign_key'=>'user')); 
    protected $_tb = 'credits'; 
    protected $_pk = 'id'; 
    // method to be implemented 
    public function total() { 
     return $total_credits_available; 
    } 
} 

// accessing the 'total' method 
$user = ORM::factory('user', 1); 
$total_credits = $user->credits->total(); 

Дело в том, как реализовать «общий» метод, который делает что-то вроде:

 
return DB::select(array(DB::expr('SUM(qty * sign)'), 'total')) 
    ->from($this->_tb) 
    ->where('user', '=', $user_id) 
    ->execute() 
    ->total; 

Метод подсчитывает пользователей-х кредиты (могут быть + кредиты и -кредиты) и возвращать общую сумму доступных кредитов. Пока я использую метод ORM :: factory для создания пользовательского объекта, я бы хотел реализовать метод «total» таким образом, что он использует загруженные ресурсы, а не запускает новый запрос (я написал указанный выше запрос, чтобы продемонстрировать бизнес логика).

Любые предложения? :)

ответ

6
<?php 
class Model_user extends ORM { 

     protected static $_totals = array(); 

     protected $_has_many = array('credits', array('model'=>'credit', 'foreign_key'=>'user')); 

     public function total() 
     { 
      $total = Arr::get(Model_User::$_totals, $this->id, FALSE); 

      if ($total !== FALSE) 
       return $total; 

      return Model_User::$_totals[$this->id] = $this->credits 
       ->select(array(DB::expr('SUM(qty * sign)'), 'total')) 
       ->find() 
       ->total; 
     } 
    } 
+0

Прохладный, работает отлично! Большое спасибо, Kemo –

 Смежные вопросы

  • Нет связанных вопросов^_^