2012-10-08 60 views
14

私はDoctrine ORMライブラリで遊び始めました。そしてImはテーブル間のすべての関連付けについて学習し始めました。Doctrine - OneToOne単方向対OneToOne双方向

私は単方向性と双方向性の違いで差し迫っています。

私がそれを得ると、一方向の関係は主キーのみを一方の側に持ち、その側は右側を所有していますか? 双方向リレーションは両方のテーブルにプライマリキーを持っているため、両側からリレーションを持ち両側に制約を設定できます。

ここでは、関係に関するドクトリンの文書を読み、そこにあなたは: UnidirectionalBidirectionalの関連があります。

しかし、それらは同じSQLと、同じ主キーと制約を持つ同じテーブルを生成します。だから私は本当にそれらの2つの違いを見ていない。どちらの例も片方の主キーを持っています。

真の双方向関係では、両方のテーブルの主キーが別のテーブルを指している必要がありますか?そして、Doctrineのドキュメントにはあてはまらない例があります。どちらの例も同じ結果をもたらし、同じです。

私は何をしましたか、これはユーザーとカードエンティティを持ち、リレーションシップを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図でどのように見えるでしょうか?

ありがとうございます!

+0

誰でもいいですか?誰も? :D – otporan

答えて

12

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

9

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

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

だからunidirで。 rel。 model_aはmodel_bに到達できますが、model_bはmodel_aに到達できません(余分な作業なし)。 今は2者を使用している場合。両モデルは、教義の面では問題

せずにお互いにアクセスすることができますREL(あなたがそれらを呼び出したいしかし、またはアクセサ)双方向の関係は、メソッドの両方を定義するのに対し、一方向の関係は、 $modelA->getModelB()方法ではなく、$modelB->getModelA()方法を定義します

それは次のようになり、UMLダイアグラムに:

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

bidirectional 
modelA <--------> modelB