Kohana 3.2 ORM定义由两列组成的外键


Kohana 3.2 ORM define foreign keys consisting of two columns

我正在Kohana框架上构建一个应用程序。对于内容管理,我将使用Joomla框架,这样我们的文案就可以在熟悉的UI中轻松添加和编辑内容。

我定义了一篇文章可以属于的几个类别。例如博客(catid = 1)和产品(catid = 2)。使用joomla内容表中的xreference列,用户必须将文章分配给所选类别中的特定id(因为Model_Blog可以包含id = 1Model_Product也可以)。

因此,Joomla中的每一篇文章都由catidxreference的独特组合组成。现在我想将这种一对一的关系绑定到我的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'))
);

请注意,我的解决方案只适用于一对一关系,因为在我的情况下,不需要为一对多实现它,尽管我怀疑这需要类似的修改