Laravelのモデル関連付け(一)
8953 ワード
一対一の関連
一対一の関連は最も基本的な関連関係である.主に以下の2つの実現方式がある.
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