KO3:假装Kohana_ORM模型的属性

时间:2010-09-08 15:49:25

标签: model kohana-3 kohana-orm

假设我有一个非常简单的模型,如下所示:

class Model_Person extends ORM
{
 /*
     CREATE TABLE `persons` (
   `id` INT PRIMARY KEY AUTO_INCREMENT,
   `firstname` VARCHAR(45) NOT NULL,
   `lastname` VARCHAR(45) NOT NULL,
   `date_of_birth` DATE NOT NULL,
  );
 */
}

有没有办法我可以添加一个带全名的假装属性?

所以我可以做到这一点:

$person = ORM::factory('person', 7);
echo $person->fullname;

而不是:

$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;

另一个例子可能是is_young属性,可以计算人的年龄,如果年龄低于某个数字,则返回true。

3 个答案:

答案 0 :(得分:4)

你可以像这样使用“魔术”__get()方法:

public function __get($column)
{
    switch($column)
    {
        case 'fullname' : 
            return $this->firstname.' '.$this->lastname;

        case 'is_young' :
            // calculate persons age
    }
    return parent::__get($column);
}

或者您可以创建其他方法,例如fullname()age()(对我来说似乎更好)。

答案 1 :(得分:0)

为什么不使用这个解决方案?

class Model_Person extends ORM 
{
      public function fullname()
      {
           return $this->firstname.' '.$this->lastname;
      }
 }

$person = ORM::factory('person', 1); 
echo $person->fullname();

答案 2 :(得分:0)

您可以在application/classes/ORM.php中执行以下操作 (3.2 {之前的Kohana application/classes/orm.php):

<?php
class ORM extends Kohana_ORM {
    public function __get($name) {
        $getter = 'get_' . $name;
        if (method_exists($this, $getter)) {
            return $this->$getter();
        }

        return parent::__get($name);
    }
}

然后你可以在模型类中添加一个方法:

public function get_fullname() {
    return $this->firstname . ' ' . $this->lastname;
}

并且能够将其作为财产进行访问。