私は双子の例が少し混乱していることに同意します。あなたは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
)
)
)
));
}
私はあなたを誤解しているかもしれませんが、Componentモデルはコンポーネントのインスタンス(コンポーネントのタイプではない)を表し、Componentはcomponent1またはcomponent2のいずれかの1つのProduct(インスタンスでも、「クラス」でもない)関係はhasOneではないでしょうか? また、コンポーネントモデル(基本的には最初の例のものと同じですが、hasOne-> hasManyを除く)では、両方の関係をチェックする必要なくコンポーネントの製品にアクセスする方法に関する問題が残ります。コンポーネントは、製品のコンポーネント1またはコンポーネント2です)。 – zephyr
必要に応じてComponentをComponentInstanceに置き換えることができます。 hasOneに関する編集2を参照してください。主にテーブルを分割するときに使用します。コンポーネントのすべての製品にアクセスするには、編集3を参照してください。 – RabidFire
Ah。 foreignKeyをfalseに設定できるかどうかは分かりませんでした(これはどこかに書かれていますか?)。しかし、それは再帰性を破るようです。再帰的に2に設定すると、コンポーネントの「Unknown column:Component.id in WHERE句」というエラーが表示されます。これは、Product上の別のクエリ(再帰から)には存在しません。定期的に宣言された外部キー関係の場合、これらのタイプのクエリはidを定数として取得します(たとえば、「 'Component'。 'id'」ではなく「(3)」)。あなたのメソッドBのようなことができるかもしれませんが、私はCakePHPシステムの他の部分とうまく統合する方法があることを期待していました。 – zephyr