relations multiples dans CakePHP
-
25-09-2019 - |
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?
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?