Qual é a sintaxe para uma exclusão de várias mesas em um banco de dados MySQL usando doutrina?
-
20-09-2019 - |
Pergunta
Usando Doutrina, Estou tentando excluir registros em uma única tabela com base em dados coletados em várias tabelas.
'Companies_groups' é uma tabela de associação que liga 'empresas' a 'grupos'. Quero excluir todos os registros nesta tabela vinculada a uma empresa específica, com a restrição de que apenas os registros 'Companies_Groups' vinculados a um grupo 'público' serão excluídos.
Se eu escrevesse isso em puro SQL, seria algo assim:
DELETE companies_groups
FROM companies_groups, groups
WHERE companies_groups.companyID = 7
AND companies_groups.groupID = groups.id
AND groups.groupType = 'public'
Qual é o equivalente na doutrina? Estou lutando e experimentando há mais ou menos uma hora.
No momento eu tenho isso:
$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 ) );
(Meus modelos de doutrina são 'Company_Group' para a tabela 'Companies_groups' e 'Grupo' para a tabela de 'grupos')
Que produz este SQL:
DELETE FROM companies_groups, groups WHERE (companyid = ? AND grouptype = 'public' AND id = groupid)
Você pode ver que o SQL gerado está ausente 'Companies_Groups' entre excluir e de, e que os qualificadores são retirados (o que significa que 'id' será ambíguo).
Deixe -me saber se houver alguma informação adicional que eu possa fornecer que seja útil.
Solução
Resolvi-o. Em vez de tentar construir a junta -me, usei uma subconsulta e não tentei forçar a doutrina a construir o SQL de uma maneira específica.
Para qualquer outra pessoa que precise fazer algo assim, aqui está o que acabou funcionando:
$query = Doctrine_Query::create()
->delete('Company_group')
->where( "companyID = ?", array( $companyID ) )
->addWhere( "groupID IN (SELECT g.id FROM Group g WHERE g.groupType = 'public')" );
Felicidades.