0

Doctrine\ORM\Mapping の問題に戸惑いました。私には 2 つのエンティティがあり、それらは多対 1 の一方向の関係です。生産者に影響を与えずにChipinfo(追加/更新/削除)を操作したい。プロデューサーを永続化せずに Chipinfo のみを永続化します。

class Chipinfo  implements
{
/**
 * @var integer
 *
 * @ORM\Column(name="ChipID", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $chipid;

/**
 * @var \Shop\Entity\Producer
 *
 * @ORM\ManyToOne(targetEntity="Shop\Entity\Producer")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="pId", referencedColumnName="producerid")
 * })
 */
protected $pid;
}  
class Producer{

/**
* @ORM\Id
* @ORM\Column(name="producerid", type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $producerId;

/**
* @ORM\Column(name="producername", type="string")
*/
protected $producerName;
}

ChipInfo と Producer は多対一の一方向の関係です。chipinfo は 1 つのプロデューサーによってのみ構築できますが、1 つのプロデューサーは複数の chipinfo を構築できます。私が望むのは、Chipinfo 内のアイテムの追加/更新/削除は Producer に何の影響も与えないということです。

$chip = new Chipinfo();
$formData = $this->initFormData($form->getData());
$chip->populate($formData);
$this->getEntityManager()->persist($chip);
$this->getEntityManager()->flush();

private function initFormData(&$raw){

    $raw['eid'] = new Encapuser($this->findEntity("Shop\Entity\Encapuser", $raw['eid']));
    $this->log($raw->eid);
    $raw['vid'] = new Vendors($this->findEntity("Shop\Entity\Vendors", $raw['vid']));

    $raw['pid'] = new Producer($this->findEntity("Shop\Entity\Producer", $raw['pid']));

    $this->log($raw);
    return $raw;

}

エラーをスローします:

    エンティティの永続操作をカスケードするように構成されていない関係 'Shop\Entity\Chipinfo#pid' を通じて、新しいエンティティが見つかりました: Shop\Entity\Producer@00000000349002ee00000000c955fd11。この問題を解決するには: この不明なエンティティで明示的に EntityManager#persist() を呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。問題の原因となっているエンティティを特定できない場合は、'Shop\Entity\Producer#__toString()' を実装して手がかりを得ることができます。

次に、pidを次のように構成しました。

@ORM\ManyToOne(targetEntity="Shop\Entity\Producer", cascade={"persist"})

エラーは消えますが、これは私が望むものではありません。既存のプロデューサー A で chipinfo に対して flush() を呼び出すと、複製された新しい A が挿入されるためです。

したがって、私の質問は次のとおりです: 1) @manyToone フィールドをどのように設定すればよいですか?推移的永続化カスケード操作

2) 追加する必要があります: @ORM\OneToMany, targetEntity="Shop\Entity\Producer" private @chip;

プロデューサーで?もしそうなら、プロデューサーでの操作 (追加/削除/更新) は @chip を構築する必要がありますか?

4

1 に答える 1