¿Cuál es la sintaxis de una multi-mesa borrar en una base de datos MySQL utilizando Doctrina?

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

Pregunta

Doctrina , estoy tratando de eliminar los registros en una sola tabla basado en datos recogidos de varias tablas.

'companies_groups' es una tabla de asociación que une a 'grupos' 'de las empresas. Quiero borrar todos los registros en esta tabla vinculada a una empresa en particular, con la restricción de que sólo los registros '' companies_groups vinculados a un grupo 'público' será eliminado.

Si tuviera que escribir esto en SQL puro, se vería algo como esto:

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

¿Cuál es el equivalente en Doctrina? He estado luchando y experimentando durante una hora o así que ahora.

En el momento tengo esto:

$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 ) );

(Mis modelos son Doctrina 'Company_group' para la mesa de los 'companies_groups' y 'Grupo' de la tabla 'grupos')

que produce este SQL:

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

Se puede ver que el SQL generado no se encuentra '' entre companies_groups Eliminar y alguna de, y que la fase de clasificación se dejan caer (que significa 'id' será ambigua).

Quiero saber si hay alguna información adicional que puede proporcionar esa sería de gran ayuda.

¿Fue útil?

Solución

resolvió. En lugar de tratar de construir la unión a mí mismo que utiliza una subconsulta y no trató de forzar Doctrina para construir el SQL de una manera específica.

Para cualquier persona que nunca tiene que hacer algo como esto, aquí es lo que terminó de trabajo:

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

Saludos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top