簡體   English   中英

Doctrine要求在OneToMany單向關聯中使用mappedBy

[英]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資源中的AddressAddress不知道User )。 這樣的例子也可以在Doctrine文檔第5.6章中找到 具有連接表的一對多,單向

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM