Je moet heel voorzichtig zijn met de relatie die je zoekt. Uit een snelle blik op enkele van deze antwoorden lijken ze te suggereren dat u eenvoudig een join aan het e-mailmodel toevoegt aan uw persoonsmodel en vertrouwt op de voorwaarden van uw vondst om ervoor te zorgen dat uw zoekopdracht het geheugen van uw server niet doorzoekt.
Ik ga ervan uit dat je allereerst wilt dat deze e-mailrelatie impliciet is in al je vragen over Persoon, anders kun je gewoon specifiek de join op elke query waarvoor u het wilde hebben. In dit geval wil je het zeker koppelen met modelrelaties .
Uw code laat zien dat Shooting en ShootingPlacement (veronderstel dat dit een model-naar-model-toewijzingsrelatie is) beide tot twee modellen behoren. Overigens, Schieten belongsTo
Emissie - die we hier nog niet hebben gezien. Ik neem aan dat dit niet van toepassing is op het huidige scenario.
Laten we nu aannemen dat het slecht is omdat uw e-mailtabel externe sleutels heeft , het wordt een hasOne
relatie, in plaats van een hasMany
- dus dat is wat je nodig hebt om het te koppelen. Ik ga het koppelen aan het ShootingPlacement-model omdat dit het model is dat u opvraagt, dus het zou het centrale punt moeten zijn waarop modellen eromheen worden samengevoegd. Qua structuur, omdat alles lijkt voort te komen uit uw Persoonsmodel, zou ik u willen voorstellen dat . te vragen in plaats daarvan modelleren. Maar door de manier waarop het tot nu toe is ingesteld, kun je bijna overal query's uitvoeren en toch grotendeels dezelfde resultaten ophalen, afgezien van een paar modelnamen en tabelaliassen.
Puur omdat je refererende sleutel tussen Email en ShootingPlacement een andere naam heeft, en CakePHP 1.3 hier niet goed mee omgaat, ga ik je ook aanraden om geen refererende sleutel te gebruiken, maar deze in de relatie te plaatsen als voorwaarden .
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'
)
);
}
Ik heb daar ook het beheersbare gedrag toegevoegd. Hierdoor kunt u vanuit elke query bepalen welke gekoppelde modellen u wilt retourneren met uw primaire modelresultaten. Het is standaard ingesteld op alles, maar kan handig zijn als u alleen iets specifieks wilt en/of om geheugenredenen (dit soort query's kunnen uw servergeheugen vrij snel vernietigen als u ze niet beperkt of alleen de veldnamen specificeert die u wilt terug).
Als je nu je e-mailmodel maakt, raad ik je aan om deze warboel van verstrengelde modellen niet nog ingewikkelder te maken door het weer terug te koppelen aan ShootingPlacement. Zoals je al zei, heeft het ook een externe sleutel voor het Person-model. Dus misschien wilt u precies hetzelfde doen als hierboven voor uw Persoonsmodel (uiteraard de voorwaarden wijzigen om de externe sleutel Persoon weer te geven). Zo is je model wat flexibeler; het zal nog steeds deelnemen aan ShootingPacement en Persoon, en u kunt deze indien nodig ook afzonderlijk opvragen zonder de andere bijbehorende modellen.