Symfony2 で関連付けを適切に構成できません。1 対多の関係 (多くの世帯メンバーと 1 人のクライアント) の場合、現在のコードは以下に表示されます。
メンバーの foreach ループを省略すると、期待どおりにクライアントが追加されます。現在のエラーは次のとおりです。
「Mana\ClientBundle\Entity\Client#members」という関係を通じて、エンティティの永続操作をカスケードするように構成されていない新しいエンティティが見つかりました: Mana\ClientBundle\Entity\Member@00000000248e5b80000000004cc2e70f. この問題を解決するには: この不明なエンティティで EntityManager#persist() を明示的に呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。問題の原因となっているエンティティが見つからない場合は、'Mana\ClientBundle\Entity\Member#__toString()' を実装して手がかりを得ます。
クライアント エンティティのスニペット
namespace Mana\ClientBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Mana\ClientBundle\Entity\Client
*
* @ORM\Table(name="client")
* @ORM\Entity
*/
class Client
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Mana\ClientBundle\Entity\Member", mappedBy="client")
*/
protected $members;
public function __construct()
{
$this->members = new ArrayCollection();
}
public function setMembers(ArrayCollection $members)
{
$this->members = $members;
return $this;
}
public function addMember(Member $member)
{
$this->members->add($member);
return $this;
}
public function removeMember(Member $member)
{
$this->members->removeElement($member);
return $this;
}
public function getMembers()
{
return $this->members;
}
世帯エンティティ
namespace Mana\ClientBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Mana\ClientBundle\Entity\Member
*
* @ORM\Table(name="household")
* @ORM\Entity
*/
class Member
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="members")
* @ORM\JoinColumn(name="clientId", referencedColumnName="id")
*
*/
protected $client;
//--- properties
public function setClient(Client $client)
{
$this->client = $client;
return $this;
}
public function getClient()
{
return $this->client;
}
// getters, setters
コントローラ createAction():
public function createAction(Request $request)
{
$client = new Client();
$form = $this->createForm(new ClientType(), $client);
$form->bind($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($client);
$em->flush();
foreach ($client->getMembers() as $member)
{
$em->persist($member);
}
$em->flush();
return $this->redirect($this->generateUrl('client_show', array('id' => $entity->getId())));
}