2009-12-16 6 views
2

j'ai 2 tables dans ma db ...Trouvez des conditions comme 'EXISTE PAS'

Entita
id int (11)
descrizione varchar (50)
... ..

Publicobjects
....
modèle varchar (50) le modèle que je dois (dans ce cas 'Entita')
model_id int (11)

Je voudrais faire une requête comme ceci:
select entita.* from entita where NOT EXISTS (select * from publicobjects where publicobjects.model = 'Entita' and publicobjects.model_id = entita.id)

Comment puis-je faire cela avec les fonctions du modèle de Cakephp sans utiliser de requête personnalisée?

Merci

+0

Je ne pense pas 'WHERE NOT EXISTS' est une expression SQL valide (My), et je ne peux pas vraiment imaginer comment sélectionner des enregistrements inexistants de toute façon. Pouvez-vous décrire en mots ce que vous voulez obtenir? – deceze

+0

Oui, est une expression MySql valide ... voir ici: http://dev.mysql.com/doc/refman/5.0/fr/exists-and-not-exists-subqueries.html :) –

+0

Oups, appris quelque chose Nouveau. :) Je ne l'ai jamais utilisé et, chose intéressante, il n'est même pas sorti lors de la recherche dans les documents MySQL. – deceze

Répondre

2

je crois que vous essayez de trouver les lignes de la table Entita qui ne sont pas dans le tableau Publicobjects. Si l'on suppose que est correcte, voici la requête SQL pour MySQL pour le trouver:

SELECT `entita`.* 
FROM `entita` 
LEFT JOIN `publicobjects` ON (`publicobjects`.`model` = 'entita' 
    AND `publicobjects`.`model_id` = `entita`.`id`) 
WHERE `publicobjects`.`model_id` IS NULL 

Pour faire ce travail avec les modèles de CakePHP deux étapes. J'ai fait des suppositions sur les noms de vos modèles, mais je peux me tromper et ceux-ci sont faciles à corriger.

d'abord l'ajouter au modèle Entita:

<?php 
var $hasOne = array('Publicobject' => array(
    'foreignKey' => 'model_id', 
    'conditions' => 'Publicobject.model = "Entita"')); 

Maintenant, vous pouvez vérifier les entrées qui manquent dans le tableau Publicobjects comme ceci:

<?php 
$this->Entita->find('all', array('conditions' => array('Publicobject.model_id IS NULL'))); 
+0

J'ai oublié de considérer LEFT JOIN sur ma requête ... J'ai utilisé EXISTS qui est le même ... :) Merci! Cependant, si je veux sélectionner seulement 'Entita' qui sont aussi sur 'Publicobject', je dois changer les conditions: 'Publicobject.model_id IS NOT NULL' ... :) –