Каков синтаксис удаления нескольких таблиц в базе данных MySQL с использованием Doctrine?

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

Вопрос

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

«company_groups» — это таблица связей, связывающая «компании» с «группами».Я хочу удалить все записи в этой таблице, связанные с определенной компанией, с ограничением: будут удалены только записи «company_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 отсутствует «company_groups» между DELETE и FROM и что квалификаторы удалены (это означает, что «id» будет неоднозначным).

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

Это было полезно?

Решение

Решил это.Вместо того, чтобы пытаться создать соединение самостоятельно, я использовал подзапрос и не пытался заставить 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')" );

Ваше здоровье.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top