php的db类库Eloquent单独使用系列(1)
php的db类库Eloquent单独使用系列(2) - 分页
php的db类库Eloquent单独使用系列(3) - sql日志
php的db类库Eloquent单独使用系列(4)- 事件监听
php的db类库Eloquent单独使用系列(5)- 模型转数组
php的db类库Eloquent单独使用系列(6)- 一对一关联
php的db类库Eloquent单独使用系列(7)- 一对多关联
php的db类库Eloquent单独使用系列(8)- 多对多关联
php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
php的db类库Eloquent单独使用系列(10)- 多对多关联 - 远程一对多
php的db类库Eloquent单独使用系列(11)- 多对多关联 - 添加模型属性
php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
本系列文章的目的就是脱离laravel环境使用Eloquent,因为它好用。
本系列文章所有代码均测试通过。Eloquent版本:5.4.27
本文的目的是使用多对多关联。
首先建表,一个用户有多个角色,一个角色可对应多个用户。需建3张表才能满足需求。
CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL DEFAULT '' COMMENT '用户名称', age int(11) NOT NULL DEFAULT '0' COMMENT '年龄', PRIMARY KEY (id) ); CREATE TABLE roles ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称', PRIMARY KEY (id) ); CREATE TABLE user_roles ( id int(11) NOT NULL AUTO_INCREMENT, user_id int NOT NULL DEFAULT 0 COMMENT '用户id', role_id int NOT NULL DEFAULT 0 COMMENT '角色id', create_time int not null default 0 comment '创建时间', PRIMARY KEY (id) );
源代码
总共3个文件,主程序,用户模型类,角色模型类,注意没有关联表模型!
User.php
<?php namespace app\model; use \Illuminate\Database\Eloquent\Model; /** * User模型类 */ class User extends Model { protected $table = 'users'; public $timestamps = false; public function roles() { // 重要说明:参数2是关联表名,参数3是关联表里对应本类的外键,参数4对应参数1的外键 return $this->belongsToMany('app\model\Role', 'user_roles' , 'user_id', 'role_id') ->withPivot('create_time' ); } }
Role.php
<?php namespace app\model; use \Illuminate\Database\Eloquent\Model; /** * Role模型类 */ class Role extends Model { protected $table = 'roles'; public $timestamps = false; public function users() { // 重要说明:参数2是关联表名,参数3是关联表里对应本类的外键,参数4对应参数1的外键 return $this->belongsToMany('app\model\User', 'user_roles' , 'role_id', 'user_id') ->withPivot('create_time' ); } }
主程序:
<?php namespace app\control; use Illuminate\Database\Capsule\Manager; use app\model\User; use app\model\Role; class Ill3 { /** * 主程序。 */ public function index() { $db = new Manager (); $db->addConnection ( [ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'test1', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '' ] ); $db->setAsGlobal (); $db->bootEloquent (); $db::delete('delete from users '); $db::delete('delete from roles '); $db::delete('delete from user_roles '); $user = new User (); $user->name = '用户1'; $user->id = 1; $user->save (); // 新模型添加 $user = new User (); $user->name = '用户2'; $user->id = 2; $user->save (); // 新模型添加 $role = new Role(); $role->id = 1; $role->name = '超级管理员'; $role->save (); // 新模型添加 $role = new Role(); $role->id = 2; $role->name = '管理员'; $role->save (); // 新模型添加 $role = new Role(); $role->id = 3; $role->name = '普通用户'; $role->save (); // 新模型添加 $db::table('user_roles')->insert([ 'user_id' => 1, 'role_id' => 2, 'create_time' => time(), ]); $db::table('user_roles')->insert([ 'user_id' => 1, 'role_id' => 3, 'create_time' => time(), ]); $db::table('user_roles')->insert([ 'user_id' => 2, 'role_id' => 2, 'create_time' => time(), ]); echo "<h2>用户1的所有角色</h2>"; echo User::find(1)->roles->toJson(JSON_UNESCAPED_UNICODE); echo "<br>"; echo "<h2>角色2的所有用户</h2>"; echo Role::find(2)->users->toJson(JSON_UNESCAPED_UNICODE); echo "<br>"; echo '<br>all ok!'; } }
浏览器输出
总结:
- 通过pivot属性可读取中间表的字段值
- 竟然不需要替中间表建模型
- 和前面一样,调用的方法不带括号,动态属性调用如 roles
- toJson带参数可以避免中文被编码