あなたはあなたが求めている関係に非常に注意する必要があります。これらの回答のいくつかを一目見ただけで、Eメールモデルへの結合をPersonモデルに追加し、検索の条件に依存して、クエリがサーバーのメモリを破壊しないようにすることを提案しているようです。
>まず最初に、この電子メールの関係をPersonに対するすべてのクエリで暗黙的にする必要があると想定します。そうでない場合は、単に指定することができます。 必要な各クエリの結合。この場合、モデルの関係 。
あなたのコードは、ShootingとShootingPlacement(これはモデルとモデルのマッピング関係であると想定しています)の両方が2つのモデルに属していることを示しています。ちなみに、belongsTo
に属します エミッション-まだここでは見ていません。これは現在のシナリオには当てはまらないと思います。
ここで、Eメールテーブルに外部キーがあるために悪いことを想定しましょう。 、hasOne
になります hasMany
ではなく、関係 -それはあなたがそれをリンクする必要があるものです。これはクエリを実行しているモデルであるため、ShootingPlacementモデルにリンクします。これは、モデルがその周りで結合される中心点である必要があります。構造的には、すべてがPersonモデルに由来しているように見えるため、それをクエリすることをお勧めします。 代わりにモデル。ただし、これまでの設定方法では、ほぼどこからでもクエリを実行でき、いくつかのモデル名とテーブルエイリアスを除いてほとんど同じ結果を取得できます。
EmailとShootingPlacementの間の外部キーの名前が異なり、CakePHP 1.3はこれをうまく処理できないため、外部キーを使用せず、代わりに条件 。
class ShootingPlacement extends AppModel
{
var $name = 'ShootingPlacement';
var $actsAs = array('Containable');
var $hasOne = array(
'Email' => array(
'className' => 'Email',
'foreignKey' => false,
'conditions' => array(
'Email.shooting_placement_id = ShootingPlacement.id',
'Email.person_id = ShootingPlacement.person_id'
)
)
);
var $belongsTo = array (
'Person' => array (
'className' => 'Person',
'foreignKey' => 'person_id',
'order' => 'lastname ASC'
),
'Shooting' => array (
'className' => 'Shooting',
'foreignKey' => 'shooting_id'
)
);
}
また、そこに包含可能な動作を追加しました。これにより、各クエリから、プライマリモデルの結果とともに返したい関連モデルを制御できます。デフォルトではすべてになりますが、特定のものだけが必要な場合やメモリ上の理由で便利です(これらの種類のクエリは、制限しないか、必要なフィールド名のみを指定すると、サーバーメモリをすぐに破壊する可能性があります戻る)。
これで、Eメールモデルを作成するときに、ShootingPlacementに再度リンクして、この絡み合ったモデルの混乱をさらに複雑にすることはお勧めしません。あなたが言ったように、それはまた、Personモデルへの外部キーを持っています。したがって、Personモデルに対して上記とまったく同じことを実行することをお勧めします(もちろん、Person外部キーを反映するように条件を変更します)。このようにして、モデルはもう少し柔軟になります。引き続きShootingPlacementおよびに参加します 人、および他の関連するモデルなしで必要に応じて個別にクエリすることもできます。