我还无法在Symfony2中正确配置关联。对于一对多关系(许多家庭成员与一个客户),当前代码如下所示 省略成员foreach循环时,将按预期添加客户端。目前的错误是:
通过这种关系找到了一个新的实体 未配置为的'Mana \ ClientBundle \ Entity \ Client#members' 实体的级联持久化操作: 法力\ ClientBundle \实体\会员@ 00000000248e5b80000000004cc2e70f。至 解决此问题:显式调用EntityManager#persist()on 这个未知的实体或配置级联持久存在此关联 映射例如@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
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())));
}
答案 0 :(得分:0)
" $ members"包含?
你得到的错误是你基本上试图存储一些具有" client_id"在数据库中,但不是由您的对象设置。
如果任何$ members包含该列,则可能需要调用类似
的内容$member->setClient($entity)
在你尝试冲洗()之前。
此外,您知道,在实际调用$ em-> flush()之前,该错误不会被抛出,因为它是唯一一次尝试插入某些内容进入你的数据库。它可能在没有for循环的情况下工作,因为$ member永远不会添加到客户端,因此它不会尝试持久化它们。
您不应该直接分配客户ID。你的第一个关系更正确。
// In HouseHold
/**
*@ORM\ManyToOne(targetEntity="Client")
*@ORM\JoinColumn(name="clientId", referencedColumnName="id")
*/
protected $client;
public function getClient() { return $this->client; }
public function setClient(Client $client) { $this->client = $client; }
比$ member-> setClient($ client)而不是setClientId()。
就Doctrine而言,clientId变量对它没有任何意义。它正在客户端上寻找getClientId()。
答案 1 :(得分:0)
要识别的基本因素是Doctrine仅对ManyToOne关系的拥有方所做的更改起作用,而拥有方是包含ManyToOne子句的实体。因此,就目前的情况而言,家庭是需要坚持的拥有者,而不是客户。所以控制器的关键变化是:
$member->setClient($client);
$em->persist($member);
答案 2 :(得分:0)
你可以使用
foreach ($client->getMembers() as $member)
{
$em->merge($member);
}