Kohana 3.2 ORM определяет внешние ключи, состоящие из двух столбцов - PullRequest
2 голосов
/ 07 января 2012

Я создаю приложение на основе Kohana.Для управления контентом я буду использовать каркас Joomla, чтобы наши копирайтеры могли легко добавлять и редактировать контент в привычном им интерфейсе.

Я определил несколько категорий, к которым может принадлежать статья.Например, блог (catid = 1) и продукт (catid = 2).При наличии столбца xreference в таблице содержимого joomla пользователь должен назначить статью для определенного идентификатора в выбранной категории (поскольку 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')
);

Может кто-нибудь посоветовать мне, как правильно связать эти отношения?

1 Ответ

3 голосов
/ 08 января 2012

После поиска в исходном коде я обнаружил, что Kohana ORM не поддерживает описанную мной функцию, и мне пришлось расширить модуль ORM (что из-за природы Kohana, кусок пирога :)), чтобы реализовать многоколонные ФК.

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'))
);

Обратите внимание, что мое решение применимо только к отношениям 1-к-1, потому что в моем случае нет необходимости реализовывать его для 1-ко-многим, хотя я подозреваю, что для этого потребуется аналогичная модификация

...