修改Doctrine集合不会影响数据库表

时间:2011-02-05 17:47:36

标签: php orm doctrine-orm

我完全是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'   消息'找到了一个新实体   通过一种不是的关系   配置为级联持久化   操作:@。明确坚持   新实体或配置级联   坚持不懈的行动   关系'。

1 个答案:

答案 0 :(得分:2)

您将Customer #host定义为反面。将数据保存到数据库时,只考虑拥有方。请参阅有关此问题的手册章节。

http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#owning-side-and-inverse-side

在您的情况下,如果您想拥有Customer#addHosts而不是Host#addCustomer,则必须在两个实体上切换“mappedBy”和“inversedBy”关键字。