Eloquent ORM -關(guān)聯(lián)關(guān)系
一對(duì)一
比如一個(gè)用戶只能擁有一個(gè)手機(jī)號(hào)碼
//laravel的機(jī)制
Phone 模型默認(rèn)有一個(gè) user_id 外鍵
User 模型默認(rèn)有一個(gè) phone_id 外鍵
//在User模型下定義一個(gè)phone方法
class User extends Model{
public function phone()
{
return $this->hasOne('App\Phone');
//也可以自定義外鍵值
//return $this->hasOne('App\Phone', 'foreign_key');
}
}
//建立關(guān)聯(lián)屬性
//這里find的方法會(huì)是通過主鍵查詢
$phone = User::find(1)->phone;
//在Phone模型下定義一個(gè) user方法
class Phone extends Model{
public function user()
{
//電話號(hào)碼屬于用戶
return $this->belongsTo('App\User');
//同樣的也可以自定義外鍵值
//return $this->belongsTo('App\User', 'foreign_key');
}
}
一對(duì)多
比如一篇文章?lián)碛卸鄠€(gè)評(píng)論
//同樣的套路烛愧,Post下?lián)碛幸粋€(gè)comments方法
//注意這里的comments是復(fù)數(shù)的形式鬼雀,因?yàn)橐粚?duì)多
class Post extends Model{
public function comments()
{
return $this->hasMany('App\Comment');
}
}
//建立關(guān)聯(lián)屬性
$comments = Post::find(1)->comments;
//在Comment 模型下定義一個(gè) post方法
class Comment extends Model{
public function post()
{
//評(píng)論屬于哪一篇文章
return $this->belongsTo('App\Post');
}
}
多對(duì)多
比如一個(gè)用戶擁有多個(gè)權(quán)限,一個(gè)權(quán)限可以被很多用戶擁有芥炭。
這樣需要第三方的連接表,users、roles 和 role_user搀暑,role_user 表按照關(guān)聯(lián)模型名的字母順序命名蚂四,并且包含 user_id 和 role_id 兩個(gè)列光戈。
//同樣的套路哪痰,User下?lián)碛幸粋€(gè)roles方法
//注意這里的roles是復(fù)數(shù)的形式,因?yàn)槎鄬?duì)多
class User extends Model{
public function roles()
{
//多對(duì)多
return $this->belongsToMany('App\Role')->withPivot('其他字段')->withTimestamps();
}
}
//同樣的套路久妆,Role下?lián)碛幸粋€(gè)users方法
//注意這里的roles是復(fù)數(shù)的形式晌杰,因?yàn)槎鄬?duì)多
class Role extends Model{
public function users()
{
//多對(duì)多
return $this->belongsToMany('App\User')->withPivot('其他字段')->withTimestamps();
}
}
//和其他不一樣的是多對(duì)多擁有第三個(gè)中間表
第三張表結(jié)構(gòu)
$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('role_id');
時(shí)間戳字段需要,withTimestamps
$table->timestamps(); // 時(shí)間戳
其他字段筷弦,這里需要自己定義withPivot
//外鍵定義
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('rold_id')->references('id')->on('roles');