2012-01-07 4 views
2

私はKohanaフレームワーク上にアプリケーションを構築しています。コンテンツ管理のために、私はJoomlaフレームワークを使用します。そのため、私たちのコピーライターは、おなじみのUIにコンテンツを簡単に追加および編集できます。Kohana 3.2 ORMは2つの列で構成される外部キーを定義します

私は記事が属することができるいくつかのカテゴリを定義しました。例えば。ブログ(catid = 1)と製品(catid = 2)です。 joomlaコンテンツテーブルのxreference列では、ユーザーは選択したカテゴリの特定のIDに記事を割り当てる必要があります(Model_Blogにはid = 1と同様にModel_Productを含めることができるため)。

したがって、joomlaのすべての記事は、catidxreferenceというユニークな組み合わせで構成されています。今では、この1対1の関係をKohana ORMモデル(例:Model_Blog)にバインドしたいと考えていますが、標準のKohana ORM $_has_oneプロパティでは、複数のAFAIKではなく1つの列からなる外部キーのみがサポートされます。

私はもちろん、動作しない、次のことを試してみました:

protected $_has_one = array(
    'content' => array('model' => 'cms_content', 'foreign_key' => 'xreference', 'catid' => '1') 
); 

誰が正しく、この関係をバインドする方法で私に助言することはできますか?

+0

http://kohanaframework.org/3.0/guide/orm/relationships – hakre

+0

ありがとうコメント、hakre。残念ながら、**複数の**列に基づいて関係を定義する方法については説明していないため、Kohanaのドキュメントでは十分ではありません。 – Plankje

+0

すでに関係が含まれているビューをMySQLで作成します。その後、Kohanaがそのビューをサポートしていない場合に備えて、そのビューのモデルを作成します。 – hakre

答えて

3

ソースコードを検索した後、Kohana ORMが私が説明した機能をサポートしていないことが判明し、ORMモジュールを拡張する必要がありました(これはKohanaの性質、マルチカラムFKを実装します。

protected $_has_one = array(
    'content' => array('model' => 'cms_content', 'foreign_key' => array('xreference' => null, 'catid' => '1')) 
); 

私の解決策が唯一の1対1の関係に適用されることに注意してください:

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

今私は、次の構文との関係で外部キーを構成する列の配列を定義することができますなぜなら、これには同様の変更が必要だと思われますが、私の場合は1対多のために実装する必要はないからです。

+0

これを使用して問題を解決しました。ありがとう! Kohanaの私のバージョンはいくつかの変更が必要でした($ model - > _ object_nameは$ model-> table_name()になりました)。 – Aaron

関連する問題