2011-01-05 33 views
0

私はモデルPersonとモデルTwin(双子のペアを意味する)を持っているとします。 Twinsには2つのPersonの外部キーがあります。たとえば、first_born_idとsecond_born_idは2人の異なる人のIDフィールドを参照しています(Person内)。ケーキの関係をどうやってセットアップするのですか?CakePHPにおける複数の関係

私はツインのようなものだろうと思います。

$belongsTo = array('FirstBorn' => array('className' => 'Person', 
             'foreignKey' => 'firstborn_id'), 
        'SecondBorn' => array('className' => 'Person', 
             'foreignKey' => 'secondborn_id')); 

をしかし、どのように、私は人を設定する必要がありますか?

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin', 
              'foreignKey' => 'firstborn_id'), 
       'TwinAsSecondborn' => array('className' => 'Twin', 
              'foreignKey' => 'secondborn_id')); 

しかし、私は人を持っていると私はその双子について知りたいときに、私は両方の関係をチェックする必要がありますが私はそれが好き行うことができます。私はPersonが双子関係にある2つの方法のいずれかを表す "Twin"関係を得る方法があることを望んでいると思います。

これを設定するより良い方法がありますか?

答えて

1

私は双子の例が少し混乱していることに同意します。あなたはProductモデル(あなたの例ではTwin)を持っていて、それには常に2 Componentモデルが添付されているとします。

components: id - name 
products: id - component1_id - component2_id 

次のように私は、製品を設定します:として

var $belongsTo = array(
    'Component1' => array(
     'className' => 'Component', 
     'foreignKey' => 'component1_id' 
    ), 
    'Component2' => array(
     'className' => 'Component', 
     'foreignKey' => 'component2_id' 
    ) 
); 

とコンポーネント:

基本的に
var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
     'className' => 'Product', 
     'foreignKey' => 'component1_id' 
    ), 
    'ProductWithComponentAsComponent2' => array(
     'className' => 'Product', 
     'foreignKey' => 'component2_id' 
    ) 
); 

を、あなたはhasManyとあなたのhasOneを交換する必要があります。各コンポーネントには、最初のコンポーネントである多くの製品があります。同時に、それは2番目のコンポーネントである多くの製品を持っています。物事がはっきりすることを願っています。

EDIT 1:(ああ、「ProductWithComponentAsComponent#は」ただ説明のためであるあなたは、あなたの実際のモデルに応じたいものは何でも短い、甘い別名を維持することができます。)

EDIT 2:hasOneの関係を使用するための親指のシンプルなルール - あなたは

)ユーザー/プロフィールのような(多くのEDIT 3に、単一のテーブルを分割している場合にのみ、それを使用してください:あなたがしたい場合コンポーネントのすべての製品を使用する場合は、2つの方法でこれを行うことができます。

(A)あなたのhasMany関係にforeignkeyをfalseとして定義します。

var $hasMany = array(
    'Product' => array(
     'className' => 'Product', 
     'foreignKey' => false, 
     'conditions' => array(
      'or' => array(
       "Product.component1_id = Component.id", 
       "Product.component2_id = Component.id" 
      ) 
     ) 
    ) 
); 

(B)上記の方法が機能しない場合(ケーキは、今して奇妙な行為)、あなたもそれを従わせるために参加することができます。コンポーネントモデルで次のように関数を作成します。

function fetchProducts($id) { 
    if (!$id) { 
     return null; 
    } 
    return $this->Product->find('all', array(
     'fields' => array('Product.*'), 
     'joins' => array(
      array(
       'table' => 'components', 
       'alias' => 'Component', 
       'foreignKey' => false, 
       'type' => 'inner', 
       'conditions' => array(
        'or' => array(
         "Product.component1_id = Component.id", 
         "Product.component2_id = Component.id" 
        ), 
        'Component.id' => $id 
       ) 
      ) 
     ) 
    )); 
} 
+0

私はあなたを誤解しているかもしれませんが、Componentモデルはコンポーネントのインスタンス(コンポーネントのタイプではない)を表し、Componentはcomponent1またはcomponent2のいずれかの1つのProduct(インスタンスでも、「クラス」でもない)関係はhasOneではないでしょうか? また、コンポーネントモデル(基本的には最初の例のものと同じですが、hasOne-> hasManyを除く)では、両方の関係をチェックする必要なくコンポーネントの製品にアクセスする方法に関する問題が残ります。コンポーネントは、製品のコンポーネント1またはコンポーネント2です)。 – zephyr

+0

必要に応じてComponentをComponentInstanceに置き換えることができます。 hasOneに関する編集2を参照してください。主にテーブルを分割するときに使用します。コンポーネントのすべての製品にアクセスするには、編集3を参照してください。 – RabidFire

+0

Ah。 foreignKeyをfalseに設定できるかどうかは分かりませんでした(これはどこかに書かれていますか?)。しかし、それは再帰性を破るようです。再帰的に2に設定すると、コンポーネントの「Unknown column:Component.id in WHERE句」というエラーが表示されます。これは、Product上の別のクエリ(再帰から)には存在しません。定期的に宣言された外部キー関係の場合、これらのタイプのクエリはidを定数として取得します(たとえば、「 'Component'。 'id'」ではなく「(3)」)。あなたのメソッドBのようなことができるかもしれませんが、私はCakePHPシステムの他の部分とうまく統合する方法があることを期待していました。 – zephyr

0

なぜこのような双子を定義しますか?

双子、生まれたばかりの人、または生まれたばかりの人は人です。それらを親に関連付けることは、それらが「子」であり、その「DOB」が同じであるという事実である。

だからあなたのようなものはしないだろう。

人を - > ID、 名前、 年齢、 DOB、 PARENT_ID

PARENT_IDは、お子様のレコードに格納され、ツインがあるさ親の下のすべての子供をDOBと比較することによって決定されるか?

cakePHP関係を設定するのが簡単になりますか?

+0

ああ、私の例はあまりうまく選択されていないと思います。実際のアプリケーションでは、Personはコンポーネントの一種であり、Twinはこれらのコンポーネントの2つで構成された製品です(実際にはそのうちの1つのみ)。だから、2人の "人間"は、一緒に1組の "双子"を構成する以外の接続はありません。 – zephyr

+0

ああ、私は見る - コンポーネントのこの "バンドル"は2レコードしか持っていないのですか? 現在のデータ構造を投稿できますか? – diagonalbatman

+0

はい、2つのコンポーネントしか存在できません(また、製品内で異なる役割を果たすので、役割によっても区別されるため、例では「firstborn」と「secondborn」)。 実際のコードを投稿することはできませんが、モデルはサンプル(正確には関連性のないもの)のように見えます。コンポーネントデータベーステーブルには「id」フィールドがあり、製品テーブルにはコンポーネント「id」フィールドを参照する2つの外部キーフィールド(「component_a_id」および「component_b_id」)があります。 – zephyr

関連する問題