Question

Supposons que (faute de meilleur exemple) je une personne modèle et un autre modèle double (ce qui signifie une paire de jumeaux). Twins a deux personnes clés étrangères, par exemple first_born_id et second_born_id faisant référence aux champs id de deux personnes différentes (en personne). Comment puis-je mettre en place les relations dans le gâteau?

Je suppose que jumeau aurait quelque chose comme:

$belongsTo = array('FirstBorn' => array('className' => 'Person',
                                        'foreignKey' => 'firstborn_id'),
                   'SecondBorn' => array('className' => 'Person',
                                         'foreignKey' => 'secondborn_id'));

Mais comment dois-je mettre en place personne? Je pouvais le faire comme:

$hasOne = array('TwinAsFirstborn' => array('className' => 'Twin',
                                           'foreignKey' => 'firstborn_id'),
                'TwinAsSecondborn' => array('className' => 'Twin',
                                           'foreignKey' => 'secondborn_id'));

Mais quand j'ai une personne et je veux connaître son jumeau je besoin de vérifier les deux relations. Je suppose que j'espère qu'il ya un moyen d'obtenir une relation « Twin » en personne représentant l'une des deux façons une personne peut être dans une relation double.

Ou est-il une meilleure façon de régler cela?

Était-ce utile?

La solution

Je suis d'accord avec l'exemple jumeau étant un peu déroutant. Permettez-moi de penser que vous avez un modèle de Product (double dans votre exemple) et il a toujours 2 modèles Component attachés.

components: id - name
products: id - component1_id - component2_id

Je créerais produit comme suit:

var $belongsTo = array(
    'Component1' => array(
        'className' => 'Component',
        'foreignKey' => 'component1_id'
    ),
    'Component2' => array(
         'className' => 'Component',
         'foreignKey' => 'component2_id'
    )
);

Et comme composant:

var $hasMany = array(
    'ProductWithComponentAsComponent1' => array(
        'className' => 'Product',
        'foreignKey' => 'component1_id'
    ),
    'ProductWithComponentAsComponent2' => array(
        'className' => 'Product',
        'foreignKey' => 'component2_id'
    )
);

En gros, vous devez remplacer votre hasOne avec hasMany. composant chaque produit hasMany où il est le premier composant. En même temps, il hasMany produits où il est le deuxième composant. L'espoir qui rend les choses claires.

EDIT 1: (.. Vous pouvez garder ce court, alias doux que vous souhaitez en fonction de vos modèles réels Oh, et "ProductWithComponentAsComponent #" est juste dans le but d'explication)

EDIT 2: règle simple pour l'utilisation des relations hasOne - Utilisez uniquement lorsque vous partagez une table unique en plusieurs (comme utilisateur / profil)

EDIT 3:. Si vous voulez que tous les produits pour un composant, vous pouvez le faire de deux façons

(A) Définir le foreignKey comme false dans votre relation hasMany.

var $hasMany = array(
    'Product' => array(
        'className' => 'Product',
        'foreignKey' => false,
        'conditions' => array(
            'or' => array(
                "Product.component1_id = Component.id",
                "Product.component2_id = Component.id"
            )
        )
    )
);

(B) Si la méthode ci-dessus ne fonctionne pas (gâteau agit maintenant bizarre puis), vous pouvez également utiliser une jointure pour le faire obéir. Créer une fonction dans le modèle de composants comme ceci:

function fetchProducts($id) {
    if (!$id) {
        return null;
    }
    return $this->Product->find('all', array(
        'fields' => array('Product.*'),
        'joins' => array(
            array(
                'table' => 'components',
                'alias' => 'Component',
                'foreignKey' => false,
                'type' => 'inner',
                'conditions' => array(
                    'or' => array(
                        "Product.component1_id = Component.id",
                        "Product.component2_id = Component.id"
                    ),
                    'Component.id' => $id
                )
            )
        )
    ));
}

Autres conseils

Pourquoi voudriez-vous définir un double comme ça?

Un jumeau, premier ou deuxième né est une personne. Ce qui les associe à un parent est le fait qu'ils sont un « enfant » et leur « date de naissance » est le même.

Alors, seriez-vous pas faire quelque chose comme:

Personne ->            ID,            Nom,            Âge,            date de naissance,            PARENT_ID

Le PARENT_ID est stocké dans le dossier Childs, et le jumeau est déterminé en comparant tous les enfants de moins d'un parent pour la date de naissance?

Est-ce le rendre plus facile à mettre en place vos relations CakePHP?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top