我正在Kohana框架上构建一个应用程序。对于内容管理,我将使用Joomla框架,这样我们的文案就可以在熟悉的UI中轻松添加和编辑内容。
我定义了一篇文章可以属于的几个类别。例如博客(catid = 1
)和产品(catid = 2
)。使用joomla内容表中的xreference
列,用户必须将文章分配给所选类别中的特定id(因为Model_Blog
可以包含id = 1
,Model_Product
也可以)。
因此,Joomla中的每一篇文章都由catid
和xreference
的独特组合组成。现在我想将这种一对一的关系绑定到我的Kohana ORM模型(例如Model_Blog
),但标准的Kohana-ORM $_has_one
属性只支持由一列而不是多个AFAIK组成的外键。
我尝试了以下方法,当然不起作用:
protected $_has_one = array(
'content' => array('model' => 'cms_content', 'foreign_key' => 'xreference', 'catid' => '1')
);
有人能建议我如何正确地绑定这种关系吗?
在源代码中查找后,我发现Kohana ORM不支持我描述的功能,我不得不扩展ORM模块(这是因为Kohana的本质,很简单:)),以实现多列FK。
class ORM_Modified extends ORM {
public function __get($column) {
if (isset($this->_has_one[$column])) {
$model = $this->_related($column);
$pk = $this->pk();
// Use this model's primary key value (if no value set) and foreign model's column(s)
if(!is_array($this->_has_one[$column]['foreign_key'])) {
$col = ;
$model->where($model->_object_name.'.'.$this->_has_one[$column]['foreign_key'], '=', $pk);
} else {
foreach($this->_has_one[$column]['foreign_key'] as $col => $value) {
$model->where($model->_object_name.'.'.$col, '=', $value == null ? $pk : $value);
}
}
$model->find();
return $this->_related[$column] = $model;
} else {
return parent::__get($column);
}
}
}
现在,我可以定义一个列数组,这些列按照以下语法的关系形成外键:
protected $_has_one = array(
'content' => array('model' => 'cms_content', 'foreign_key' => array('xreference' => null, 'catid' => '1'))
);
请注意,我的解决方案只适用于一对一关系,因为在我的情况下,不需要为一对多实现它,尽管我怀疑这需要类似的修改