Du bør være meget forsigtig med det forhold, du leder efter. Fra et hurtigt blik på nogle af disse svar, synes de at foreslå, at du blot tilføjer en joinforbindelse til e-mail-modellen i din personmodel og stoler på betingelserne for dit fund for at sikre, at din forespørgsel ikke ransager din servers hukommelse.
Jeg vil antage, at du først og fremmest ønsker, at denne e-mail-relation skal være implicit i alle dine forespørgsler på Person, ellers kan du blot specificere joinforbindelsen på hver forespørgsel, du ville have den til. I dette tilfælde vil du helt sikkert gerne linke det ved hjælp af modelforhold .
Din kode viser, at Shooting og ShootingPlacement (det antages, at dette er et model-til-model-kortlægningsforhold) begge hører til to modeller. Skydning belongsTo
Emission - som vi ikke har set her endnu. Jeg går ud fra, at dette ikke er relevant for det aktuelle scenarie.
Lad os nu antage det dårlige, fordi din e-mail-tabel har fremmednøgler , vil det være en hasOne
forhold i stedet for en hasMany
- så det er det, du skal forbinde det med. Jeg vil linke den til ShootingPlacement-modellen, fordi det er den model, du forespørger på, så det bør være det centrale punkt, hvor modellerne samles omkring den. Strukturmæssigt, fordi alt ser ud til at stamme fra din personmodel, vil jeg være nødt til at foreslå, at du spørger det model i stedet for. Men den måde, det er konfigureret på indtil nu, vil give dig mulighed for at forespørge fra næsten hvor som helst og stadig hente det meste af de samme resultater, bortset fra nogle få modelnavne og tabelaliasser.
Rent fordi din fremmednøgle mellem Email og ShootingPlacement har et andet navn, og CakePHP 1.3 ikke håndterer dette særlig godt, vil jeg også foreslå, at du ikke bruger en fremmednøgle, i stedet for at sætte den ind i forholdet som betingelser .
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'
)
);
}
Jeg har også tilføjet indholdsbar adfærd derinde. Dette giver dig mulighed for fra hver forespørgsel at kontrollere, hvilke tilknyttede modeller du ønsker at returnere med dine primære modelresultater. Det vil som standard være til alle, men kan være praktisk, når du kun ønsker noget specifikt og/eller af hukommelsesårsager (denne slags forespørgsler kan ødelægge din serverhukommelse ret hurtigt, hvis du ikke begrænser dem eller kun angiver de feltnavne, du vil returnere).
Når du nu opretter din e-mail-model, vil jeg ikke foreslå at komplicere dette rod af sammenfiltrede modeller yderligere ved at linke det tilbage til ShootingPlacement igen. Som du har sagt, har den også en fremmednøgle til Person-modellen. Så du vil måske gøre nøjagtig det samme som ovenfor for din Person-model (ændre betingelserne, så de afspejler Person-fremmednøglen selvfølgelig). På denne måde er din model lidt mere fleksibel; det vil stadig slutte sig til ShootingPlacement og person, og vil også give dig mulighed for at forespørge den separat, hvis det kræves uden de andre tilknyttede modeller.