[英]Doctrine requires mappedBy in a OneToMany unidirectional association
當我嘗試在這兩個實體之間建立OneToMany單向關聯時,我在嘗試更新數據庫模式時遇到此錯誤:
$ app / console doctrine:schema:update --dump-sql
[學說\\ ORM \\映射\\ MappingException]
字段'address'上的OneToMany映射需要'mappedBy'屬性。
/**
* User
*
* @ORM\Table()
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Address")
* @ORM\JoinTable(name="users_address",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true)}
* )
*/
private $address;
//...
}
/**
* Address
*
* @ORM\Table()
* @ORM\Entity
*/
class Address
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
}
如果關聯是單向的,為什么需要“mappedBy”? 提前致謝。
更新:正如@tchap在評論中所提到的,單向OneToMany可以與@ManyToMany映射,並在其中一個連接列上使用唯一約束來強制執行onetomany基數。 正如文檔所說,但對我來說有點混亂,因為已經有@OneToMay注釋。 所以我只需要將上面的代碼改為此(只需將@OneToMany更改為@ManyToMany):
/**
* @ORM\ManyToMany(targetEntity="Address")
* @ORM\JoinTable(name="users_address",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true)}
* )
*/
private $address;
OneToMany
必須是雙向的,並且始終是關系的反面,如果定義反向邊,則需要指向與mappedBy
屬性的關系的擁有方。 擁有方是ManyToOne
。 在你的情況下,這將是這樣的:
在User
您的關聯具有mappedBy="user"
屬性並指向擁有方Address
:
/** ONE-TO-MANY BIDIRECTIONAL, INVERSE SIDE
* @var Collection
* @ORM\OneToMany(targetEntity="Address", mappedBy="user")
*/
protected $addresses;
在Address
您的關聯具有inversedBy="addresses"
屬性並指向反向User
:
/** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE
* @var User
* @ORM\ManyToOne(targetEntity="User", inversedBy="addresses")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
此解決方案的優點是您可以通過執行以下操作找到哪個用戶擁有該Address
: $address->getUser();
並且您跳過向數據庫添加其他連接表。
如果您希望關系是單向的,您可以像在更新中那樣做; 使用連接表定義ManyToMany
關系,並在address_id
列上添加唯一約束。
/**
* @ORM\ManyToMany(targetEntity="Address")
* @ORM\JoinTable(name="user_address",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true)}
* )
*/
此解決方案的缺點是您無法找到哪個User
擁有Address
資源中的Address
( Address
不知道User
)。 這樣的例子也可以在Doctrine文檔第5.6章中找到。 具有連接表的一對多,單向 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.