有没有办法不使用 Kohana 中的子模型覆盖整个属性?
Posted
技术标签:
【中文标题】有没有办法不使用 Kohana 中的子模型覆盖整个属性?【英文标题】:Is there a way to not override the entire property with a sub model in Kohana? 【发布时间】:2010-11-10 07:56:16 【问题描述】:我有以下模型链:
Model_Auth_User
Model_Module_User
Model_App_User
Model_User
...Model_User
是我实际使用的模型,它只是一个虚拟类,而其他的都有功能。
我的问题是在Model_App_User
中我想在模型中添加一列,比如employee_flag
。我需要将它添加到_labels
、_table_columns
和可能的其他人。当然,如果我在Model_App_User
中输入以下内容:
protected $_labels = array(
'employee_flag' => 'Employee Flag',
);
整个标签数组被覆盖。不是我想要的。
我想到的一个选项是添加一个名为_override_properties
的属性,我将在初始化时处理它并与对象中的属性合并。但这也失败了,因为如果我在Model_Module_User
中使用它,它将覆盖我在Model_App_User
中放入的任何内容。
还有哪些其他选择?
【问题讨论】:
【参考方案1】:有两种解决方案。您可以通过在名为 labels
的方法中定义标签来更改 ORM 的工作方式。我想应该是这样的:
public static function labels ()
return array
(
'name' => 'First Name'
);
然后在您的子类中,它会很简单:
public static function labels ()
$labels = parent::labels();
// Add new or modify labels.
$labels['last'] = 'Last Name';
return $labels;
您需要修改 ORM 检索标签的方式才能使其工作。如果您没有时间修改 ORM 的工作方式,那么 Zahymakas 添加到子数组 __construct
的解决方案是一个不错的折衷方案。
【讨论】:
【参考方案2】:$this->_labels['employee_flag'] = 'Employee Flag';
呢?
【讨论】:
但这可以在定义中完成,因为$this
还不存在。这需要通过一种方法来完成。所以可以在_initialize()
中做到这一点。我想知道是否有另一个不需要添加另一个 _initialize()
的解决方案(虽然不是一个糟糕的解决方案)。
好吧,既然你试图修改一个属性而不是(重新)设置它,这要么必须在某种 init func 中完成,要么必须有一个像“modifyProperty”这样的方法。
_initialize()
是你需要的方法。
我不认为你可以做任何事情没有覆盖。您可以覆盖 _initialize
函数或构造函数。以上是关于有没有办法不使用 Kohana 中的子模型覆盖整个属性?的主要内容,如果未能解决你的问题,请参考以下文章
NestedScrollView 内的子级未覆盖整个屏幕高度
Kohana 3.2 中使用 ORM 模型(结果)的字段的自定义过滤器