Qual é a sintaxe para uma exclusão de várias mesas em um banco de dados MySQL usando doutrina?

StackOverflow https://stackoverflow.com/questions/2247905

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.

Foi ú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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top