Laravelのモデル関連付け(一)

8953 ワード

一対一の関連


一対一の関連は最も基本的な関連関係である.主に以下の2つの実現方式がある.
  • hasOne()
  • belongsTo()

  • 1.hasOne()使用


    例えば、Userモデルは、Phoneモデルを関連付けることができる.この関連付けを定義するために、Userモデルにphoneメソッドを記述し、phoneメソッドの内部でhasOneメソッドを呼び出し、その結果を返します.
    
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         *             。
         */
        public function phone()
        {
            return $this->hasOne('App\Phone');
        }
    }
    

    実はよく理解して、hasOne字面の意味は1つあって、1人のユーザーは1つの携帯電話の番号を持っています(ここでは1人のユーザーが複数の携帯電話の番号を持っている場合を考慮しませんか?)hasOneメソッドの最初のパラメータは、関連モデルのクラス名(ここではUserモデル関連Phoneモデル)である.関連関係が定義されると、Eloquentのダイナミックプロパティを使用して関連レコードを取得できます.アクセスモデルで定義したプロパティと同様に、ダイナミックプロパティを使用できます.
    $phone = User::find(1)->phone;
    

    ここのphoneは括弧がないことに注意してください.phone()と書かないでくださいEloquentは、親モデル名に基づいて外部キー名を決定します.現在のシナリオでは、Eloquentは、Phoneモデルにuser_id外部キー(ここでのuserは親モデルUser)があると仮定し、外部キー名がこれでない場合、hasOneメソッドにデフォルトで使用されている外部キー名を上書きする2番目のパラメータを渡すことができる.
    return $this->hasOne('App\Phone', 'foreign_key');
    

    さらに、Eloquentは、外部キー値が親モデルid(またはカスタム$primaryKey)列の値と一致すると仮定する.言い換えれば、Eloquentは、Phoneに記録されたuser_id列の中で、ユーザテーブルのid列に一致する値を検索する.この関連付けにid以外のカスタムキー名を使用する場合は、hasOneメソッドに3番目のパラメータを渡すことができます.
    return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
    

    ここでの**親モデルid**はUserモデルを指すが、hasOne()方法の場合のUserモデルクラスの1つの方法であるため、UserモデルはhasOne()方法に対して当然いわゆる親である.

    2.belongsTo()使用

    belongsTo公式ドキュメントは定義反転関連と呼ばれていますが、実はbelong toの英語が属しているという意味で、携帯電話番号はもちろんユーザーのものです.
    さっきはUserモデルからPhoneモデルにアクセスできました.次に、Phoneモデルで関連を定義します.この関連は、この電話を持つUserモデルにアクセスできます.この場合、hasOneの方法に対応するbelongsToの方法が用いられる.
    
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Phone extends Model
    {
        /**
         *           。
         */
        public function user()
        {
            return $this->belongsTo('App\User');
        }
    }
    

    上記の例では、Eloquentは、Phoneモデル上のuser_idからUserモデル上のidへのマッチングを試みる.これは、関係メソッドの名前を確認し、_idを接尾辞名として使用することによって、デフォルトの外部キー名を決定します.ただし、Phoneモデルの外部キーがuser_idでない場合、カスタムキー名は、belongsToメソッドに2番目のパラメータとして渡すことができる.
    /**
     *           。
     */
    public function user()
    {
        return $this->belongsTo('App\User', 'foreign_key');
    }
    

    親モデルがプライマリ・キーとしてidを使用していない場合、または異なるフィールドで子モデルを接続したい場合は、belongsToメソッドに3番目のパラメータを渡すことで、親データ・テーブルのカスタム・キーを指定できます.
    /**
     *           。
     */
    public function user()
    {
        return $this->belongsTo('App\User', 'foreign_key', 'other_key');
    }
    

    転入先https://laravel-china.org/docs/laravel/5.5/eloquent-relationships/1333