我完全是Doctrine 2的新手(也是ORM的新手),我在更新集合方面遇到了问题。我觉得这是一个典型的菜鸟问题。
我需要客户和主机。每个主机都分配给一些客户,每个客户可以拥有多个主机。我的(简化)课程如下:
/**
* @Entity @Table(name="Customers")
*/
class Customer
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @OneToMany(targetEntity="Host", mappedBy="cust_id") */
private $hosts = null;
public function __construct()
{
$this->hosts = new ArrayCollection();
}
public function addHost( $host )
{
$this->hosts[] = $host;
}
// plus getters/setters...
}
/**
* @Entity @Table(name="Hosts")
*/
class Host
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @ManyToOne(targetEntity="Customer", inversedBy="hosts") */
private $cust_id;
// plus getters/setters...
}
我的数据库(SQLite)表如下:
客户:id,...
主持人:id,cust_id_id,......
我可以使用以下代码创建新客户和主机:
$customer = new Customer();
$em->persist( $customer );
$em->flush();
但是当我尝试使用以下代码向客户添加一些主机时:
$customer = ... // obtain a customer object - that works.
$host = ... // obtain a host object - that works.
$customer->addHost($host);
$em->persist($customer);
$em->flush();
没有任何反应。我的意思是我看到我的数据库没有变化(受影响的主机的cust_id_id仍为空)。我想向一些使用者添加一个新主机,并在Hosts表中正确设置cust_id_id列。
我做错了什么?
更新
我认为OneToMany关系必须是反面的,因为将其声明为拥有方导致我的学说抱怨未知选项“inversedBy”。因此,我决定将客户作为反面,将主机作为拥有方,并按如下方式修改Customer-> addHost方法:
public function addHost( $host )
{
$host->setCustomerId( $this->id );
$this->hosts[] = $host;
}
现在,在调用$ em-> flush()后,我收到以下错误:
未捕获的异常 带有'InvalidArgumentException' 消息'找到了一个新实体 通过一种不是的关系 配置为级联持久化 操作:@。明确坚持 新实体或配置级联 坚持不懈的行动 关系'。
答案 0 :(得分:2)
您将Customer #host定义为反面。将数据保存到数据库时,只考虑拥有方。请参阅有关此问题的手册章节。
在您的情况下,如果您想拥有Customer#addHosts而不是Host#addCustomer,则必须在两个实体上切换“mappedBy”和“inversedBy”关键字。