Каков синтаксис удаления нескольких таблиц в базе данных MySQL с использованием Doctrine? - PullRequest
2 голосов
/ 12 февраля 2010

Используя Doctrine , я пытаюсь удалить записи в одной таблице на основе данных, собранных из нескольких таблиц.

'companies_groups' - это таблица ассоциаций, связывающая «компании» с «группами». Я хочу удалить все записи в этой таблице, связанные с определенной компанией, с тем условием, что будут удалены только записи «companies_groups», связанные с «публичной» группой.

Если бы я написал это на чистом SQL, это выглядело бы примерно так:

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

Что является эквивалентом в Учении? Я боролся и экспериментировал в течение часа или около того.

На данный момент у меня есть это:

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

(Моими моделями Doctrine являются «Company_group» для таблицы «companies_groups» и «Group» для таблицы «groups»)

Который производит этот SQL:

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

Вы можете видеть, что в сгенерированном SQL отсутствует «companies_groups» между DELETE и FROM, и что квалификаторы отброшены (что означает, что id будет неоднозначным).

Дайте мне знать, если есть какая-либо дополнительная информация, которую я могу предоставить, которая будет полезна.

1 Ответ

1 голос
/ 12 февраля 2010

Решил это. Вместо того, чтобы пытаться создать объединение самостоятельно, я использовал подзапрос и не пытался заставить Doctrine создать SQL определенным образом.

Для всех, кому когда-либо нужно делать что-то подобное, вот что в итоге сработало:

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

Приветствие.

...