20

私はDoctrineORMライブラリをいじり始め、テーブル間のすべての関連付けについて学びました。

だから私は一方向と双方向の関係の違いに固執しました。

私が理解しているように、単方向の関係には片側だけに主キーがあり、その側が所有側ですよね?また、双方向リレーションは両方のテーブルで主キーを持っているため、両側からリレーションを持ち、両側に制約を設定できます。

さて、関係についてのDoctrineのドキュメントを読んでいると、 一方向双方向の関連付けがあります。

ただし、これらは同じSQLと、同じ主キーと制約を持つ同じテーブルを生成します。ですから、私はこれら2つの違いを実際には見ていません。また、どちらの例でも、片側に主キーがあります。

私が理解したように、真の双方向関係では、両方のテーブルにもう一方のテーブルを指す主キーが必要ですか?そして、そうではない教義のドキュメンテーションの与えられた例で。どちらの例でも同じ結果が得られ、同じです。

だから私がしたことは、これです、私がユーザーとカードエンティティを持っていて、関係をOneToOne双方向にしたいとしましょう。

    /**
 * @Entity
 * @Table(name="users")
 */

class User
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

    /**
     * @OneToOne(targetEntity="Card", mappedBy="User")
     * @JoinColumn(name="card_id", referencedColumnName="id")
     */
    protected $card;

    /**
     * @Column(name="user_name", type="string")
     */
    protected $userName;

    /**
     * @Column(name="user_pass", type="string")
     */
    protected $userPass;
}

    /**
 * @Entity
 * @Table(name="cards")
 */

class Card
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="bigint")
     */
    protected $id;

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

    /**
     * @Column(name="post_title", type="string")
     */
    protected $cardType;
}

ここでの違いは、両方のオブジェクト/エンティティで@JoinColumnを記述したことです。そして、Doctrineの例では1つしかありません。今、私は双方向の関係だと思うものを得るでしょう。EERダイアグラムを見ると、1つの線がユーザーからカードを指し、もう1つの線がカードからユーザーを指していることがわかります。

だから基本的に私はこれを正しく理解しましたか?Doctrineのドキュメントは間違っていますか?:D双方向のOneToOne関係はEER図でどのように見えますか?

ありがとう!

4

2 に答える 2

19

$customer唯一の違いは、PHPクラスのインターフェースにあります。つまり、所有者を指すプロパティ(たとえば、前述のDoctrineの例のプロパティ)の有無にあります。言い換えれば、Doctrineは、単一のプロパティ($shipping)または2つのプロパティ($cartおよび$customer)のどちらを処理する必要があるかを知る必要があります。他に違いはありません。したがって、SQLコードは同じであり(1:N関係を表すには1つの外部キーで十分であるため)、EER図にも違いはありません(EERでは通常このようなPHP関連の実装の詳細を解決しないため)。

于 2012-10-16T20:05:12.137 に答える
12

単方向および双方向は、データベース層でこれらの接続を作成する方法のバックグラウンドアルゴリズムとは何の関係もありません。

彼らが話しているのは、接続の使用方法だけです。一方向の関係では、1つのサイトからのみターゲットにアクセスできます。双方向の関係により、接続を2つの(両方の)側から呼び出すことができます。

だからユニディールで。rel。model_aはmodel_bに到達できますが、model_bはmodel_aに到達できません(追加の作業なし)。今ビディールを使用している場合。rel両方のモデルが問題なく相互にアクセスできます

教義の用語では、単方向の関係は $modelA->getModelB()メソッドを定義しますが、メソッドは定義しませんが$modelB->getModelA()、双方向の関係は両方のメソッド(またはアクセサー、ただしそれらを呼び出したい場合)を定義します

UMLダイアグラムでは、次のようになります。

unidirectional
modelA --X------> modelB

bidirectional
modelA <--------> modelB
于 2012-10-10T13:24:46.440 に答える