2010-06-30 4 views
0

J'ai un modèle de données plutôt simple, mais j'ai une entité centrique appelée "item" qui est associée à 7 autres entités via 1-to-1/1-to-many des relations. Tout fonctionne bien. Mais dans la plupart des actions qui fonctionnent avec le modèle d'objet, je n'ai besoin d'aucune des associations de l'objet Model - donc mysql finit par émettre de nombreuses requêtes inutiles (à cause de l'association définie dans la classe Model "item"). J'essaie de penser à la meilleure façon de minimiser ces requêtes inutiles - Je pense à supprimer toutes les associations des classes Model, rendre tous les modèles Containable, et créer des associations en cours d'exécution si nécessaire.Cakephp associations de modèles et quantité de requêtes mysql dont ils ont besoin

Une autre option consiste simplement à utiliser bindModel/unbindModel partout où cela est utile.

Je ne sais pas vraiment quelle approche est la meilleure, et s'il y en a une autre, une façon plus appropriée de minimiser ces requêtes mysql inutiles.

Tous les commentaires serait génial :)

Répondre

1

Ne pas utiliser récursif. Ne supprimez pas vos associations.

En app_model.php add (au niveau de la classe):

var $actsAs = array('Containable'); 

Ensuite, utilisez

$this->MyModel->contain(); 

ou

$this->MyModel->contain(array('AssocThing.field','OtherThing.SubThng.field')); 

pour contrôler les tables et les champs, vous extrayez. Containable vous donnera un contrôle précis des données que vous récupérez. C'est pour ça!

1

Avant de faire la découverte() définissez la propriété récursive à 0:

$this->Model->recursive = 0; 
+0

Mais parfois je ne veux que quelques-unes des associations. Pas aucun d'entre eux. – azv

0

Je voudrais utiliser unbindModel() premier. Ensuite, je voudrais utiliser Containable behavior uniquement dans les contrôleurs ou les modèles où il ne suffit pas d'utiliser uniquement unbindModel(). Parfois, il ne suffit pas d'utiliser bind/unbind ou containable pour minimiser le nombre de requêtes. Ensuite, vous pouvez utiliser 'joins' option dans les requêtes find().

Questions connexes