sql >> Databáze >  >> RDS >> Mysql

CakePHP 1.3 - Neznámý sloupec v klauzuli where

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ů.



  1. Jak odstranit virtuální počítač z VirtualBoxu

  2. Jak se připojit k databázi MySQL v PHP pomocí rozšíření mysqli?

  3. Nahrávání souborů/obrázků blob do Mysql

  4. Výchozí řazení řádků pro výběrový dotaz v oracle