Quelle est la syntaxe pour une suppression multi-tables sur une base de données MySQL en utilisant Doctrine?
-
20-09-2019 - |
Question
Utilisation Doctrine , je suis en train de supprimer des enregistrements dans une seule table à partir des données recueillies à partir de plusieurs tables.
'companies_groups' est une table d'association liant 'entreprises aux 'groupes'. Je veux supprimer tous les enregistrements de cette table liée à une société spécifique, avec la restriction que seuls les dossiers «companies_groups de lié à un groupe « public » seront supprimés.
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? Je me bats et expérimenter pendant une heure ou maintenant.
En ce moment 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 et 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).
Permettez-moi de savoir s'il y a des informations supplémentaires que je peux fournir ce serait utile.
La solution
résolu. Plutôt que d'essayer de construire moi-même je joindre utilisé un sous-requête et n'a pas essayé de forcer la doctrine de construire SQL d'une manière spécifique.
Pour toute autre personne 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.