Měli byste být velmi opatrní se vztahem, o který usilujete. Z rychlého pohledu na některé z těchto odpovědí se zdá, že navrhují, abyste jednoduše přidali připojení k modelu e-mailu do svého modelu osoby a spoléhali se na podmínky vašeho nálezu, abyste zajistili, že váš dotaz nezatíží paměť vašeho serveru.
Budu předpokládat, že v první řadě chcete, aby byl tento e-mailový vztah implicitní ve všech vašich dotazech na osobu, jinak byste mohli jednoduše specifikovat spojení na každý dotaz, pro který jste to chtěli. V tomto případě jej určitě chcete propojit pomocí modelové vztahy .
Váš kód ukazuje, že Shooting a ShootingPlacement (předpokládejme, že se jedná o vztah mezi modelem a modelem) patří ke dvěma modelům. Mimochodem, střelba belongsTo
Emise – což jsme tu ještě neviděli. Předpokládám, že to na současný scénář nelze použít.
Nyní předpokládejme, že je to špatné, protože vaše tabulka e-mailů má cizí klíče , bude to hasOne
spíše než hasMany
- tak to je to, co potřebujete propojit. Propojím jej s modelem ShootingPlacement, protože toto je model, na který se ptáte, takže by to měl být centrální bod, ve kterém jsou modely kolem něj spojeny. Pokud jde o strukturu, protože se zdá, že vše pochází z vašeho modelu osoby, musel bych vám navrhnout dotaz to místo toho model. Ale způsob, jakým je doposud nastaven, vám umožní dotazovat se téměř odkudkoli a stále získávat většinou stejný panel výsledků, několik názvů modelů a aliasů tabulek.
Čistě proto, že váš cizí klíč mezi Emailem a ShootingPlacement má jiný název a CakePHP 1.3 to nezvládá příliš dobře, navrhuji také, abyste cizí klíč nepoužili a místo toho jej do vztahu vložili jako podmínky .
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'
)
);
}
Také jsem tam přidal zadržitelné chování. To vám umožňuje z každého dotazu řídit, které přidružené modely chcete vrátit s výsledky primárního modelu. Výchozí nastavení bude pro všechny, ale může být užitečné, když chcete pouze něco konkrétního a/nebo z paměťových důvodů (tyto druhy dotazů mohou velmi rychle zničit paměť serveru, pokud je neomezíte nebo nezadáte pouze názvy polí, která chcete návrat).
Když nyní vytváříte svůj e-mailový model, nedoporučoval bych tuto změť zapletených modelů dále komplikovat tím, že jej znovu propojíte se ShootingPlacement. Jak jste řekli, má také cizí klíč k modelu osoby. Takže možná budete chtít udělat přesně to samé jako výše pro váš model osoby (samozřejmě změnit podmínky tak, aby odrážely cizí klíč osoby). Tímto způsobem je váš model o něco flexibilnější; stále se připojí k ShootingPlacement a Osoba a také vám umožní dotazovat se na něj samostatně, pokud je to nutné, bez dalších přidružených modelů.