一对多关联

比如我们有一个用户表,每个用户都可以发布文章,用户和文章就是一对多的关系。

当然imi-demo里一对多的例子选的不好,不过不重要,理解意思就行。

定义

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

@OneToMany@JoinFrom@JoinTo@AutoSelect@AutoInsert@AutoUpdate@AutoSave@AutoDelete

如 imi-demo 中代码所示,UserWithFriend继承User。类定义了一个$friends属性,这个属性关联UserFriend模型。

UseridUserFrienduser_id关联,你可能会发现没有@JoinFrom注解,没有的话默认取左侧模型的主键。

允许自动查询、插入、更新、删除时,自动处理UserFriend模型数据,当更新时,会删除不存在的数据。

  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 $friends
  9. */
  10. class UserWithFriend extends User
  11. {
  12. /**
  13. * @OneToMany("UserFriend")
  14. * @JoinTo("user_id")
  15. * @AutoInsert(true)
  16. * @AutoUpdate(orphanRemoval=true)
  17. * @AutoDelete(true)
  18. *
  19. * @var \Imi\Util\ArrayList
  20. */
  21. protected $friends;
  22. /**
  23. * Get the value of friends
  24. *
  25. * @return \ImiDemo\HttpDemo\MainServer\Model\UserFriend[]
  26. */
  27. public function getFriends()
  28. {
  29. return $this->friends;
  30. }
  31. /**
  32. * Set the value of friends
  33. *
  34. * @param \ImiDemo\HttpDemo\MainServer\Model\UserFriend[] $friends
  35. *
  36. * @return self
  37. */
  38. public function setFriends($friends)
  39. {
  40. $this->friends = $friends;
  41. return $this;
  42. }
  43. }

查询

find

  1. $model = UserWithFriend::find(1);
  2. var_dump($model->friends); // friends数据可以直接取到,是UserFriend实例

select

  1. $list = UserWithFriend::select();
  2. foreach($list as $item)
  3. {
  4. var_dump($item->friends); // friends数据可以直接取到,是UserFriend实例
  5. }

插入

  1. $user = UserWithFriend::newInstance();
  2. $user->username = 'Yurun';
  3. // 由于继承了User类,所以一对一关系还是存在,依旧可以使用
  4. $user->ex->intro = '这个人很懒,什么也没留下';
  5. // 在朋友关系列表中增加2项
  6. $user->friends->append(
  7. UserFriend::newInstance(['friend_user_id'=>1]),
  8. UserFriend::newInstance(['friend_user_id'=>2])
  9. );
  10. $result = $user->insert();

更新

  1. $user = UserWithFriend::find(1);
  2. $user->ex->intro = '这个人很懒,什么也没留下-' . date('Y-m-d H:i:s');
  3. // 下面注释的代码,是把多余的记录删除,只保留id为4这个
  4. // $friendIds = [4];
  5. // $user->friends->clear();
  6. // $updateItems = UserFriend::query()->where('user_id', '=', $user->id)->whereIn('friend_user_id', $friendIds)->select()->getArray();
  7. // $user->friends->append(...$updateItems);
  8. // $ids = ObjectArrayHelper::column($updateItems, 'friend_user_id');
  9. // foreach(array_diff($friendIds, $ids) as $id)
  10. // {
  11. // $user->friends->append(UserFriend::newInstance([
  12. // 'friend_user_id' => $id,
  13. // ]));
  14. // }
  15. // 下面的是简单的增加两项关联
  16. $user->friends->append(
  17. UserFriend::newInstance(['friend_user_id'=>1]),
  18. UserFriend::newInstance(['friend_user_id'=>2])
  19. );
  20. $result = $user->update();

保存

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

删除

  1. $user = UserWithFriend::find(1);
  2. // 删除ID为1的记录,UserEx对应表也会删除这条关联记录
  3. $result = $user->delete();
  4. if($result->isSuccess())
  5. {
  6. echo 'success';
  7. }