3

Doctrineを使用して、複数のテーブルから収集したデータに基づいて、単一のテーブルのレコードを削除しようとしています。

「会社_グループ」は、「会社」を「グループ」にリンクする関連付けテーブルです。特定の会社にリンクされたこのテーブルのすべてのレコードを削除したいのですが、'public' グループにリンクされた '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'

Doctrineで同等のものは何ですか? 私は今、1時間ほど苦労して実験しています。

現時点で私はこれを持っています:

$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_groups' テーブルの 'Company_group' と 'groups' テーブルの 'Group' です)

次の SQL が生成されます。

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

生成された SQL では、DELETE と FROM の間に「companies_groups」がなく、修飾子が削除されていることがわかります (つまり、「id」があいまいになります)。

役立つ追加情報があれば教えてください。

4

1 に答える 1

1

解決しました。自分で結合を構築しようとするのではなく、サブクエリを使用し、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')" );

乾杯。

于 2010-02-11T22:12:04.167 に答える