一、什么是關聯模型
關聯模型指在 tp 中使用模型對多個數據表進行關聯。例如一個主賬戶表與一個賬戶信息表進行關聯,此時兩者關聯后可以更加簡便的進行操作,使代碼更加清晰,操作更加簡便。
二、 正向一對一關聯
一對一關聯指的是數據只有一條而非多條。
首先我們有一個 user 表如下:
接著給 student 表添加對應的 uid 列:
隨后我們在model 文件夾下創建一個 User 的php 文件用于模型:
在 User 模型表中編寫代碼:
<?php
namespace app\model;
use think\Model;class UserModel extends Model
{protected $name = 'user';
}
接著咱們在 User 模型中編寫對應的關聯代碼(想要關聯多張表在創建一個對應表名的方法和表模型即可):
<?php
namespace app\model;
use think\Model;class UserModel extends Model
{protected $name = 'user';public function student(){return $this->hasOne(StudentModel::class,'uid');}
}
在 student 方法中,hasOne 表示一對一關聯,其中第一個參數 StudentModel::class 表示關聯的表,而第二個參數表示其表中所關聯的外鍵為 uid。
接著我們直接使用模型進行查詢,看看是否成功關聯。我們在 index 類中更改 usemodel 方法:
public function useModel(){$user = UserModel::find(7); return json($user->student->name);
}
其中 UserModel 直接find 主鍵id 為 7 的數據,接著直接使用 json 返回 user 表下所關聯的 student 表中的 name字段,查看是否成功獲取,最后訪問該方法的結果如下,成功獲取到了數據:
三、 反向一對一關聯
有了正向關聯后反向關聯咱們可以不用進行編寫,但是你想編寫也行,咱們在 student 模型類中編寫代碼如下:
<?php
namespace app\model;
use think\Model;class StudentModel extends Model
{protected $name = 'student';public function user() { return $this->belongsTo(UserModel::class); }
}
四、一對多關聯
一對多關聯指主表關聯的數據在副表中有多條對應,例如此時我在副表中右如下數據:
此時 uid 的值是有兩條重復的,那么我們此時修改對應的 user 模型中的方法:
public function student(){//return $this->hasOne(StudentModel::class,'uid');return $this->hasMany(StudentModel::class,'uid');
}
修改 hasOne 成 hasMany 即可,此時修改對應的useModel 方法如下:
public function useModel(){$user = UserModel::find(['uid'=>20]); return json($user->student);
}
結果如下:
此時還可以進行鏈式操作,查詢身高大于 168 的數據:
public function useModel(){$user = UserModel::find(['uid'=>20]); return json($user->student()->where('height','>',168)->select());
}
結果如下:
五、關聯模型的數據新增
使用關聯模型進行數據新增,可直接使外鍵進行增加,只要考慮數據的新增即可,以下是代碼示例:
public function useModel(){$user = UserModel::find(7); $res=$user->student()->saveAll([ ['name'=>'關聯數據1', 'height'=>0], ['name'=>'關聯數據2', 'height'=>0] ]);dump($res);}
此時我們首先是使用了 find,隨后直接給與 student 數據新增,新增時不需要傳入對應的 uid 數據,因為之前在模型中已經進行了設置外鍵,那么訪問后數據庫成功新增數據:
此時成功操作后所返回的內容是對應的模型數組:
六、關聯刪除
關聯刪除可使刪除主表數據時同時刪除副表數據,以下為示例:
public function useModel(){$user = UserModel::with('student')->find(7); $res=$user->together(['student'])->delete();dump($res);
}
在這里要注意,需要使用 with 方法,隨后使用 together 傳入一個副表數組,可以傳入多個副表進行刪除,返回值為布爾值: