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 を構築する必要がありますか?