web-dev-qa-db-ja.com

Doctrineのjoin-table(ManyToMany)から行を削除する方法は?

Symfony2/Doctrineの@ORM\ManyToManyアノテーションを使用して作成された結合テーブルがあります。 CategoryテーブルとParameterテーブルを結合します。

次に、パラメーターテーブルからすべてのパラメーターを削除します。結合テーブルで定義された外部キー制約があるため、パラメーターテーブルから行を削除することはできません。まず、結合テーブルから子行を削除する必要があります。ただし、DotrineのDQL構文では、次のようにエンティティの名前を指定する必要があります。

DELETE Project\Entity\EntityName

しかし、ManyToManyアソシエーションを使用して生成された結合テーブルエンティティの名前は何ですか?それをどう扱うか?

または、@ORM\ManyToManyアノテーションで定義された結合テーブルの外部キー制約にON UPDATE CASCADEおよびON DELETE CASCADEを設定するにはどうすればよいですか。

編集:

結合テーブルスキーマ:

CREATE TABLE `categories_params` (
    `category_id` INT(11) NOT NULL,
    `param_id` INT(11) NOT NULL,
    PRIMARY KEY (`category_id`, `param_id`),
    INDEX `IDX_87A730CB12469DE2` (`category_id`),
    INDEX `IDX_87A730CB5647C863` (`param_id`),
    CONSTRAINT `categories_params_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `allegro_category` (`id`),
    CONSTRAINT `categories_params_ibfk_2` FOREIGN KEY (`param_id`) REFERENCES `category_param` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

on UPDATEおよびon DELETEはデフォルトでRESTRICTに設定されています

最終的な解決策:

 * @ORM\ManyToMany(targetEntity="CategoryParam", cascade={"persist","remove"})
 * @ORM\JoinTable(name="categories_params",
 *      joinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", onDelete="CASCADE")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="param_id", referencedColumnName="id", onDelete="CASCADE")}) 
29
Dawid Ohia

doctrineレベルでカスケードを設定するには:

@ORM\ManyToMany(targetEntity="Target", inversedBy="inverse", cascade={"remove", "persist"})

詳細: Doctrine2アノテーションリファレンス

MySQLレベルでカスケードを設定するには:

@ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE")
30
Inoryy