【相關推薦:】
資料庫表通常相互關聯。
例如,一篇部落格文章可能有許多評論,或者一個訂單對應一個下單使用者。Eloquent 讓這些關聯的管理和使用變得簡單,並支援多種型別的關聯:常見的為前三種,在此我們也只講解前三種關聯
一對一
範例:
兩個資料表:guest
使用者表和guestinfo
使用者資訊
其中guest
表中的主鍵id
欄位對應著guestinfo
中的外來鍵user_id
欄位
首先建立兩個model檔案:php artisan make:model Guest
php artisan make:model Guestinfo
Guest model檔案:
class Guest extends Model{ use HasFactory; // 設定Guest模型對應的資料表 protected $table = 'guest'; // 關閉create_time和update_time欄位自動管理 public $timestamps = false; // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字 public function guestinfo(){ // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵) return $this->hasOne('App\Models\Guestinfo','user_id','id'); }}
Guestinfo model檔案:
class Guestinfo extends Model{ use HasFactory; // 設定Guest模型對應的資料表 protected $table = 'guestinfo'; // 關閉create_time和update_time欄位自動管理 public $timestamps = false; // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字 public function guest(){ // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵) return $this->belongsTo('App\Models\Guest','user_id','id'); }}
建立一個控制器將兩個model檔案連線起來:php artisan make:controller Controllers
內容:
class Controllers extends Controller{ // public function getOne(){ // 通過關聯方法獲取guest表中username = admin記錄在guestinfo對應的記錄 // ->guestinfo 是Guest模型檔案裡面定義的guestinfo方法 $guestInfo = Guest::firstWhere('username','admin')->guestinfo; // 通過關聯方法獲取guestinfo中id=3 記錄在guest表中的對應記錄 $data = Guestinfo::find(3)->guest; dump($guestInfo); // 將模型轉換成陣列 dump($data->toArray()); }}
建立控制器的路由:Route::get('relative/getOne',[Controllers::class,'getOne']);
存取路由:
結果為:
一對多
範例:
兩個資料表:guest
使用者表和article
文章表
其中guest
表中的主鍵id
欄位對應著guestinfo
中的外來鍵user_id
欄位
建立article
model檔案:php artisan make:model Article
class Article extends Model{ use HasFactory; // 設定Guest模型對應的資料表 protected $table = 'article'; // 關閉create_time和update_time欄位自動管理 public $timestamps = false; public function guest(){ // 設定與guest的關聯方法,與一對一的從表設定一樣 return $this->belongsTo('App\Models\April\Guest','user_id','id'); }}
在Guest
model檔案中新增一個article
方法
class Guest extends Model{ use HasFactory; // 設定Guest模型對應的資料表 protected $table = 'guest'; // 關閉create_time和update_time欄位自動管理 public $timestamps = false; // 設定與guestinfo的關聯方法,方法名建議使用被關聯表的名字 public function guestinfo(){ // hasOne(被關聯的名命空間,關聯外來鍵,關聯的主鍵) return $this->hasOne('App\Models\Guestinfo','user_id','id'); } // 設定與article的關聯:hasmany 有很多 public function article(){ return $this->hasMany('App\Models\April\Article','user_id','id'); }}
在Controllers
控制器檔案中測試一下:
範例1:查詢某一個使用者發表的所有文章:
// 查詢某個使用者發表的所有文章 $article = Guest::find(1)->article; // 返回為資料集,需要遍歷 foreach ($article as $v){ dump($v->toArray()); }
範例2:查詢某個使用者最新發表的一篇文章
// 查詢某個使用者最新發表的一篇文章 // article()生成一個構造器,可以進行篩選 $article = Guest::find(1)->article()->orderby('created_at','desc')->first(); dump($article->toArray());
範例3:通過關聯查詢某篇文章的發表人的姓名
// 通過article和guest關聯,再通過guest關聯的guestinfo獲取姓名 $name = Article::find(2)->guest->guestinfo; dump($name->name);
範例4:通過關聯查詢某篇文章的評論資訊
建立Comment評論模型:php artisan make:model Comment
Comment 模型程式碼:
class Comment extends Model{ use HasFactory; // 設定Comment模型對應的資料表 protected $table = 'comment'; // 關閉create_time和update_time欄位自動管理 public $timestamps = false; // 設定與article的關聯方法,方法名建議使用被關聯表的名字 public function article(){ return $this->belongsTo('App\Models\April\Article','article_id','id'); }}
在Article模型中新增方法comment:
public function comment(){ return $this->hasMany('App\Models\April\Comment','article_id','id'); }
controller控制器程式碼:
$info = Article::find(2)->comment; foreach ($info as $v){ dump($v->toArray()); }
【相關推薦:】
以上就是詳細解析Laravel Model模型關聯的詳細內容,更多請關注TW511.COM其它相關文章!