多对多关联

比如我们要关联用户和角色之间的关系,就要用到多对多。多对多需要一张中间表来做关联。

定义

多对多关联会用到的注解:

@ManyToMany@JoinFromMiddle@JoinToMiddle@AutoSelect@AutoInsert@AutoUpdate@AutoSave@AutoDelete

如 imi-demo 中代码所示,类定义了一个$userRole属性和$role属性。

$userRole属性定义的是中间模型,指定中间模型为UserRole,右侧表模型Role,右侧表模型数据到时会赋值到$role属性中。

User模型使用id与中间模型的user_id关联,中间模型使用role_id与右侧模型id关联。

允许自动查询、插入、更新、保存、删除时,自动处理关联模型数据。

  1. /**
  2. * User
  3. * @Entity
  4. * @Table(name="tb_user", id={"id"})
  5. * @property int $id
  6. * @property string $username
  7. * @property \ImiDemo\HttpDemo\MainServer\Model\UserEx $ex
  8. * @property \Imi\Util\ArrayList $userRole
  9. * @property \Imi\Util\ArrayList $role
  10. */
  11. class User extends Model
  12. {
  13. /**
  14. * @ManyToMany(model="Role", middle="UserRole", rightMany="role")
  15. * @JoinToMiddle(field="id", middleField="user_id")
  16. * @JoinFromMiddle(middleField="role_id", field="id")
  17. *
  18. * @AutoInsert
  19. * @AutoUpdate
  20. * @AutoSave
  21. * @AutoDelete
  22. *
  23. * @var \Imi\Util\ArrayList
  24. */
  25. protected $userRole;
  26. /**
  27. * Get the value of userRole
  28. *
  29. * @return \Imi\Util\ArrayList
  30. */
  31. public function getUserRole()
  32. {
  33. return $this->userRole;
  34. }
  35. /**
  36. * Set the value of userRole
  37. *
  38. * @param \Imi\Util\ArrayList $userRole
  39. *
  40. * @return self
  41. */
  42. public function setUserRole($userRole)
  43. {
  44. $this->userRole = $userRole;
  45. return $this;
  46. }
  47. /**
  48. *
  49. *
  50. * @var \Imi\Util\ArrayList
  51. */
  52. protected $role;
  53. /**
  54. * Get the value of role
  55. *
  56. * @return \ImiDemo\HttpDemo\MainServer\Model\ArrayList[]
  57. */
  58. public function getRole()
  59. {
  60. return $this->role;
  61. }
  62. /**
  63. * Set the value of role
  64. *
  65. * @param \ImiDemo\HttpDemo\MainServer\Model\ArrayList[] $role
  66. *
  67. * @return self
  68. */
  69. public function setRole($role)
  70. {
  71. $this->role = $role;
  72. return $this;
  73. }
  74. // 其它这边省略……
  75. }

查询

find

  1. $model = UserWithFriend::find(1);
  2. // 可以取到关联关系及右侧模型数据
  3. var_dump($model->userRole);
  4. var_dump($model->role);

select

  1. $list = UserWithFriend::select();
  2. foreach($list as $item)
  3. {
  4. // 可以取到关联关系及右侧模型数据
  5. var_dump($item->userRole);
  6. var_dump($item->role);
  7. }

插入

  1. $user = UserWithFriend::newInstance();
  2. $user->username = Random::letterAndNumber(6, 16);
  3. $user->ex->intro = '这个人很懒,什么也没留下';
  4. // 插入关联关系
  5. $user->userRole->append(
  6. UserRole::newInstance(['role_id'=>1]),
  7. UserRole::newInstance(['role_id'=>2])
  8. );
  9. $result = $user->insert();

更新

  1. $user = UserWithFriend::find(1);
  2. $user->ex->intro = '这个人很懒,什么也没留下-' . date('Y-m-d H:i:s');
  3. $user->userRole->clear();
  4. // 更新关联关系
  5. $user->userRole->append(
  6. UserRole::newInstance(['role_id'=>998])
  7. );
  8. $result = $user->update();

保存

和insert、update同理,就不作演示了。

删除

  1. $user = UserWithFriend::find(1);
  2. // 删除数据和关联关系
  3. $result = $user->delete();
  4. if($result->isSuccess())
  5. {
  6. echo 'success';
  7. }