【问题标题】:Kohana 3.2 ORM define foreign keys consisting of two columnsKohana 3.2 ORM 定义由两列组成的外键
【发布时间】:2012-01-07 11:06:29
【问题描述】:

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

我已经定义了一篇文章可以属于的几个类别。例如。博客 (catid = 1) 和产品 (catid = 2)。使用 joomla 内容表中的xreference 列,用户必须将文章分配给所选类别中的特定 id(因为Model_Blog 可以包含id = 1,以及Model_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')
);

谁能告诉我如何正确绑定这种关系?

【问题讨论】:

  • 感谢您的评论,hakre。不幸的是,Kohana 文档还不够,因为它没有解释如何基于 multiple 列定义关系。
  • 在 MySQL 中创建一个已经包含关系的视图。然后为该视图创建一个模型 - 以防 Kohana 不支持。
  • 可怕的发现!!!!

标签: php orm joomla kohana


【解决方案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'))
);

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

【讨论】:

  • 刚刚用这个解决了一个问题。谢谢!我的 Kohana 版本需要一些更改($model->_object_name 变成了 $model->table_name()),但在大多数情况下,它运行良好。
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多