我完全不熟悉Doctrine 2(也適用於ORM),並且在更新集合時遇到問題。我覺得這是一個典型的noob問題。修改Doctrine集合不會影響數據庫表
我需要客戶和主機。每臺主機都分配給一些客戶,每個客戶可以擁有多臺主機。我(簡體)班如下:
/**
* @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仍然是空的)。我想爲某個使用者添加一個新主機,並在主機表中正確設置cust_id_id列。
我在做什麼錯?
更新:
我想,一對多的關係必須要反的一面,因爲它聲明爲擁有方造成了我的教訓抱怨未知的選項「inversedBy」。所以,我決定離開客戶爲反方,並且主機作爲擁有方,並修改客戶 - > addHost方法如下:
public function addHost($host)
{
$host->setCustomerId($this->id);
$this->hosts[] = $host;
}
現在,調用$ EM->的flush()後,我得到以下錯誤:
Uncaught exception 'InvalidArgumentException' with message 'A new entity was found through a relationship that was not configured to cascade persist operations: @. Explicitly persist the new entity or configure cascading persist operations on the relationship.'
IMO,您應該將`Host :: $ cust_id`重命名爲`Host :: $ customer`。 – Cobby 2011-02-06 23:45:07
這與[此問題]非常相似(http://stackoverflow.com/questions/4928170/getting-associated-entries-in-doctrine-2) – xzyfer 2011-02-08 09:52:04