【圖書介紹】《ThinkPHP 8高效構建Web應用》-CSDN博客
《2025新書 ThinkPHP 8高效構建Web應用 編程與應用開發叢書 夏磊 清華大學出版社教材書籍 9787302678236 ThinkPHP 8高效構建Web應用》【摘要 書評 試讀】- 京東圖書
使用VS Code開發ThinkPHP項目-CSDN博客
編程與應用開發_夏天又到了的博客-CSDN博客
每個主模型都有多個關聯模型,一般在關聯模型添加一個外鍵實現,在模型中使用hasMany定義。下面是用戶和地址的一對多關聯示例。首先在mydb數據庫中創建address表及其數據(表比較簡單,我們賦予這表一個意義,即保存用戶游玩過的省份。建議讀者直接用MySQL Workbench工具快速完成),SQL語句如下:
CREATE TABLE `address` (`aid` int NOT NULL AUTO_INCREMENT,`id` int NOT NULL,`province` varchar(45) COLLATE utf8mb3_unicode_ci NOT NULL,PRIMARY KEY (`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(1,1, '北京' );
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(2,1, '上海' );
INSERT INTO `mydb`.`address`(`aid`,`id`,`province`) VALUES(3,1, '廣東' );
1. 用戶模型
用戶模型示例如下:
<?php
namespace app\model;use think\Model;class UserModel extends Model
{protected $table = 'users';// 設置字段信息protected $schema = ['id' => 'int','name' => 'string','nickname' => 'string','status' => 'int',];public function profile(){return $this->hasOne(ProfileModel::class,'id'); // hasOne}// 在一對一關聯示例代碼的基礎上,再加一個一對多關聯方法public function addresses(){return $this->hasMany(AddressModel::class, 'id'); // hasMany}
}
2. 地址模型
地址模型示例如下:
<?php
namespace app\model;use think\Model;class AddressModel extends Model
{ protected $table = 'address';// 設置字段信息protected $schema = ['aid' => 'int','id' => 'int','province' => 'string',];
}
3. 關聯查詢
由于只有同一個數據庫的數據表可以與表相連,因此在分庫分表的場景下,筆者建議使用with查詢兩次的方法。
<?php
namespace app\controller;use think\Model;
use app\model\UserModel;
use app\model\ProfileModel;class User {public function one2many(){$users = UserModel::with('addresses')->select();foreach ($users as $user) {foreach($user->addresses as $address) {print_r($user->name.', '. $address->province.'<br>');}}}
}
上面2個模型1個控制器完成后,運行服務器,在瀏覽器中訪問http://localthost:8000/user/one2many,可以關聯查詢出id為1的用戶所有游玩過的省份。
4. 關聯保存
使用關聯模型的saveAll方法保存關聯數據。下面是批量保存地址的示例:
$user = UserModel::find(2);
$user->addresses()->saveAll([['province'=>'北京'],['province'=>'上海'],
]);
5. 關聯刪除
和一對一關聯相同,一對多關聯也使用together方法刪除關聯數據。示例如下:
$user->together(['addresses'])->delete();