簡體   English   中英

單向與雙向的一對一關系

[英]unidirectional vs bidirectional in one-to-one relationship

我正在閱讀Doctrine文檔 ,我遇到了這些概念而感到困惑。

我有這些表:

用戶 - > id,角色,電子郵件,用戶名,密碼

學生 - > id,user_id,fname,lname

教師 - > id,user_id,fname,指定

user_id是Users表中的外鍵。 這應該是單向關系還是雙向關系?

他們有什么不同?

有人可以為兩者提供真實世界的例子嗎?

Doctrine docs 在這里說, Doctrine只會檢查協會的擁有方是否有變化。 這意味着什么? 什么樣的變化?

通常,您可以隨時使用單向或雙向關系。 您可以根據自己的需要設計代碼。 也就是說,例如,如果要聲明單向關系,oneToOne是因為您只需要在一側獲取信息。 相反,如果您需要從兩個實體訪問有關另一個實體的信息,您需要聲明您的雙向關系。 例如:

假設您的用戶 - 教師關系是OneToOne。

案例1:您需要知道用戶是否是教師,並且您還需要知道哪個用戶與教師實體相關=>您使用雙向關系。

/** @Entity */
class User
{
    // ...

    /**
     * @OneToOne(targetEntity="Teacher", mappedBy="user")
     */
    private $teacher;

    // ...
}

/** @Entity */
class Teacher
{
    // ...

    /**
     * @OneToOne(targetEntity="User", inversedBy="teacher")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    // ...
}

默認表看起來像:

CREATE TABLE Teacher (
    id INT AUTO_INCREMENT NOT NULL,
    user_id INT DEFAULT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Teacher ADD FOREIGN KEY (user_id) REFERENCES User(id);

案例2:您需要訪問教師相關用戶,但您永遠不需要知道作為教師的用戶,因此您只聲明教師方面的部分。

參考: http//docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#one-to-one-unidirectional

有一些限制,主要是在oneToMany關系中。 一般來說,我會建議你使用雙向關系。

“Doctrine docs在這里說,Doctrine只會檢查一個協會的擁有方面是否有變化。這意味着什么?有什么樣的變化?”

我並不完全確定這一點,但我可以告訴你我對此的理解:當你在實體中刷新你的更改時(在更改它們並執行$ entityManager-> flush()之后),它只會檢查您對關系中主實體的更改,也就是說,如果您在另一個實體中更改了某個實體,則不會檢查這兩個實體,只會在關系中的主實體中更改。 因此,您必須聲明所有者是“基礎”的,而不是相反。 例如,在上一個示例中,如果您從教師實體更改了用戶實體,則Doctrine不會將其記入帳戶,因為User是所有者方。

例如:

$teacher->getUser()->setName('john'); //Doctrine won't check for this change
$user->getTeacher()->setStatus('dismissed'); //Doctrine will track this change

正如我告訴你的那樣,我沒有測試過這種情況,因為我通常會很好地宣布我的關系(你的FK將定義哪個是所有者方,在這種情況下是User)。 無論如何,進行測試並確認它並不困難。

暫無
暫無

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

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