Каков синтаксис удаления нескольких таблиц в базе данных MySQL с использованием Doctrine?
-
20-09-2019 - |
Вопрос
С использованием Доктрина, я пытаюсь удалить записи в одной таблице на основе данных, собранных из нескольких таблиц.
«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')" );
Ваше здоровье.