2010-02-11 7 views
2

En utilisant Doctrine, j'essaie de supprimer des enregistrements dans une seule table en fonction des données recueillies à partir de plusieurs tables. 'Companies_groups' est une table d'association reliant les 'sociétés' aux 'groupes'. Je souhaite supprimer tous les enregistrements de cette table liés à une société spécifique, avec la restriction que seuls les enregistrements 'companies_groups' liés à un groupe 'public' seront supprimés.Quelle est la syntaxe pour une suppression multi-tables sur une base de données MySQL en utilisant Doctrine?

Si je devais écrire ce dans SQL pur, il ressemblerait à quelque chose comme ceci:

DELETE companies_groups 
FROM companies_groups, groups 
WHERE companies_groups.companyID = 7 
AND companies_groups.groupID = groups.id 
AND groups.groupType = 'public' 

Quel est l'équivalent dans la doctrine? J'ai lutté et expérimenté pendant une heure maintenant.

Au moment où j'ai ceci:

$query = Doctrine_Query::create() 
    ->delete('Company_group cg') 
    ->from('Company_group cg, Group g') 
    ->where("cg.companyID = ? AND g.groupType = 'public' AND g.id = cg.groupID ", array($companyID)); 

(Mes modèles Doctrine sont 'Company_group' pour la table 'companies_groups de 'groupe' pour la table 'groupes')

qui produit cette SQL:

DELETE FROM companies_groups, groups WHERE (companyid = ? AND grouptype = 'public' AND id = groupid) 

Vous pouvez voir que le SQL généré est manquant « companies_groups » entre SUPPRIMER et FROM, et que les qualifications sont sautées (qui signifie « id » sera ambigu). Faites-moi savoir s'il y a des informations supplémentaires que je pourrais vous fournir.

Répondre

1

Résolu. Plutôt que d'essayer de construire la jointure moi-même, j'ai utilisé une sous-requête et je n'ai pas essayé de forcer Doctrine à construire le SQL d'une manière spécifique.

Pour quelqu'un d'autre qui a besoin jamais faire quelque chose comme ça, voici ce qui a fini par travailler:

$query = Doctrine_Query::create() 
    ->delete('Company_group') 
    ->where("companyID = ?", array($companyID)) 
    ->addWhere("groupID IN (SELECT g.id FROM Group g WHERE g.groupType = 'public')"); 

Vive.

Questions connexes