Laravel5.6 Eloquent ORM 關聯關系,一對一和一對多
阿新 • • 發佈:2018-11-19
結果 new long rop rec date bsp method func
Laravel5.6 關聯模型的操作,主要是一對一,一對多,多對多等操作.下面示例主要解析前面兩個操作用法比較常用.(操作和用法TP5類似)
將關聯查詢使用語法hasOne、hasMany、belongsTo進行一個舉例說明?
hasOne:有一個,加上主謂語應該是, A 有一個 B
hasMany:有很多, A 有很多 B
belongsTo:屬於, A 屬於 B
demo示例:
假設Users模型和News模型存在關聯關系.兩表sql和假設數據如下:
users.sql sql文件
1 DROP TABLE IF EXISTS `users`; 2 CREATE TABLE `users` (3 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 4 `name` char(30) NOT NULL DEFAULT ‘‘ COMMENT ‘名稱‘, 5 `created_at` timestamp NULL DEFAULT NULL COMMENT ‘創建時間‘, 6 `updated_at` timestamp NULL DEFAULT NULL COMMENT ‘更新時間‘, 7 PRIMARY KEY (`id`) 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘用戶表‘; 9 10 -- ---------------------------- 11 -- Records of users 12 -- ---------------------------- 13 INSERT INTO `users` VALUES (‘1‘, ‘admin_01‘, ‘2018-11-19 10:06:17‘, ‘2018-11-19 10:06:22‘); 14 INSERT INTO `users` VALUES (‘2‘, ‘admin_02‘, ‘2018-11-19 10:09:27‘, ‘2018-11-19 10:09:34‘); 15 INSERT INTO`users` VALUES (‘3‘, ‘admin_03‘, ‘2018-11-19 11:36:56‘, ‘2018-11-19 11:37:00‘);
news.sql sql文件
1 CREATE TABLE `news` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `users_id` int(10) NOT NULL DEFAULT ‘1‘ COMMENT ‘用戶表id‘, 4 `author` char(30) NOT NULL DEFAULT ‘‘ COMMENT ‘作者‘, 5 `content` text NOT NULL COMMENT ‘內容‘, 6 `created_at` timestamp NULL DEFAULT NULL COMMENT ‘創建時間‘, 7 `updated_at` timestamp NULL DEFAULT NULL COMMENT ‘更新時間‘, 8 PRIMARY KEY (`id`) 9 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=‘新聞表‘; 10 11 -- ---------------------------- 12 -- Records of news 13 -- ---------------------------- 14 INSERT INTO `news` VALUES (‘1‘, ‘1‘, ‘ Ning‘, ‘Hello World 01‘, ‘2018-11-19 10:08:04‘, ‘2018-11-19 10:07:59‘); 15 INSERT INTO `news` VALUES (‘2‘, ‘2‘, ‘Wang‘, ‘Hello World 02‘, ‘2018-11-19 10:11:01‘, ‘2018-11-19 10:11:08‘); 16 INSERT INTO `news` VALUES (‘3‘, ‘3‘, ‘Li‘, ‘Hello World 03‘, ‘2018-11-19 11:37:57‘, ‘2018-11-19 11:37:59‘); 17 INSERT INTO `news` VALUES (‘4‘, ‘3‘, ‘Hong‘, ‘Hello World 04‘, ‘2018-11-19 15:02:26‘, ‘2018-11-19 15:02:29‘);
一對一:
例如:一個 Users 模型有一個與之關聯的 News 模型.
Users.php Users模型
1 <?php 2 3 namespace App\Model\Eloquent\Admin; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Users extends Model 8 { 9 protected $table = ‘users‘; 10 11 /** 12 * 關聯news表 13 */ 14 public function newsMethod() 15 { 16 //hasOne($related, $foreignKey = null, $localKey = null) 17 //第一個參數為對應的model, 第二個參數默認為model對應的表的外鍵, 第三個參數默認為當前模型對應的表的主鍵 18 return $this->hasOne(‘App\Model\Eloquent\Admin\News‘,‘users_id‘, ‘id‘); 19 } 20 }
News.php News模型
1 <?php 2 3 namespace App\Model\Eloquent\Admin; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class News extends Model 8 { 9 protected $table = ‘news‘; 10 11 /** 12 * 相對關聯users表 13 */ 14 public function usersMethod() 15 { 16 //belongsTo($related, $foreignKey = null, $ownerKey = null, $relation = null) 17 //第一個參數為model, 先講第四個參數,默認為調用belongsTo()的方法名字, 第二個參數默認為第四個參數加上 ‘_id‘, 第三個參數默認為model的對應表的主鍵 18 return $this->belongsTo(‘App\Model\Eloquent\Admin\Users‘,‘users_id‘,‘id‘); 19 } 20 }
關聯查詢 -- 查詢users和news兩表關聯id=1,一條數據
1 $data = Users::find(1)->newsMethod->toArray();
結果打印:
相對關聯查詢 -- 查詢users表關聯id=2,一條數據
1 $data = News::find(2)->usersMethod->toArray();
結果打印:
一對多
一對多關聯:是定義單個模型擁有多個其它模型的關聯關系.
Users.php Users模型
1 <?php 2 3 namespace App\Model\Eloquent\Admin; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Users extends Model 8 { 9 protected $table = ‘users‘; 10 11 /** 12 * 關聯news表 假設一對多 13 */ 14 public function newsMethodMany() 15 { 16 return $this->hasMany(‘App\Model\Eloquent\Home\News‘,‘users_id‘, ‘id‘); 17 } 18 }
關聯查詢 -- 查詢users和news兩表關聯id=3,兩條數據
1 $data = Users::find(3)->newsMethodMany->toArray();
結果打印:
查詢存在的關聯關系操作語法.
兩表關聯數據
with:類似於 SQL 中的 left join
1 $data = News::with(‘usersMethod‘)->get()->toArray();
has:類似於 SQL 中的 inner join
1 $data = News::has(‘usersMethod‘)->get()->toArray();
whereHas:inner join 之後,可以補充查詢條件
1 $data = News::whereHas(‘usersMethod‘, function ($query) { 2 $query->where(‘users_id‘, ‘=‘, ‘3‘); 3 })->get()->toArray();
Laravel5.6 Eloquent ORM 關聯關系,一對一和一對多