2

ManyToMany 関係のコレクションを介してフォームを保存しようとしていますが、問題はオブジェクトを永続化することです!

class Anagrafica
{
/**
 * @ORM\ManyToMany(targetEntity="SubCategories", inversedBy="anagrafiche", cascade={"persist", "remove"})
 * @ORM\JoinTable(name="AnCat")
 **/
private $subCategories;

//..
public function __construct()
{
$this->subCategories = new \Doctrine\Common\Collections\ArrayCollection();
//..
}

/**
 * Add subCategories
 *
 * @param \My\BusinessBundle\Entity\SubCategories $subCategories
 * @return Anagrafica
 */
public function addSubCategory(\My\BusinessBundle\Entity\SubCategories $subCategories)
{
    $subCategories->addAnagrafiche($this);
    $this->subCategories[] = $subCategories;
}

*******
class SubCategories
{
/**
 * @ORM\ManyToMany(targetEntity="Anagrafica", mappedBy="subCategories")
 */
private $anagrafiche;

public function __construct()
{
    $this->anagrafiche = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add anagrafiche
 *
 * @param \My\BusinessBundle\Entity\Anagrafica $anagrafiche
 * @return SubCategories
 */
public function addAnagrafiche(\My\BusinessBundle\Entity\Anagrafica $anagrafiche)
{
    $this->anagrafiche[] = $anagrafiche;
}

アナグラフィタイプ:

//..
->add('subCategories', 'collection', array('type' => new SubCategoriesType(), 
                'allow_add' => true,
                'allow_delete' => true,
                'prototype' => true,
                'prototype_name' => '__categ__',
                'by_reference' => false
            ))

データベースに既に存在するサブカテゴリを選択しても保存すると、クエリ挿入が実行されます。

INSERT INTO SubCategories (subCategory, category_id) VALUES (?, ?)
Parameters: { 1: Object(Doctrine\Common\Collections\ArrayCollection), 2: 12 }

私はどこで間違っていますか?

4

1 に答える 1

1

これは、永続化するときにサブカテゴリが存在するかどうかを手動で確認する必要があるために発生します。エンティティdatatransformerのメソッドに直接チェック コードを使用したり配置したり、ライフサイクル コールバックを使用したりすることもできます。ロジックは次のとおりです。既存のすべてのサブカテゴリを取得してから、入力したサブカテゴリをループします。サブカテゴリが既存のサブカテゴリで見つかった場合、入力された新しいサブカテゴリを渡す代わりに、結果の ArrayCollection に既存のエンティティを追加します。タグを使用した同じタスクのプロジェクトで使用したコード例を次に示します。addSubCategoryprePresist

$existingSubcategories = $repository->findAll();

if (count($existingSubcategories) < 1)
    return $enteredSubcategories;

$resultCollection = new \Doctrine\Common\Collections\ArrayCollection();

foreach ($enteredSubcategories as $enteredSubcategory)
{
    $exists = false;
    foreach ($existingSubcategories as $existingSubcategory)
    {
        // compare them by any unique param
        if ($existingSubcategory->getName() == $enteredSubcategory->getName())
        {
            $exists = true;
            break;
        }
    }

    $resultCollection[] = ($exists === true) ? $existingSubcategory : $enteredSubcategory;
}

return $resultCollection;
于 2013-02-26T19:07:23.373 に答える