多对多关联

优质
小牛编辑
143浏览
2023-12-01

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

定义

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

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

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

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

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

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

/**
 * User
 * @Entity
 * @Table(name="tb_user", id={"id"})
 * @property int $id
 * @property string $username
 * @property \ImiDemo\HttpDemo\MainServer\Model\UserEx $ex
 * @property \Imi\Util\ArrayList $userRole
 * @property \Imi\Util\ArrayList $role
 */
class User extends Model
{
    /**
     * @ManyToMany(model="Role", middle="UserRole", rightMany="role")
     * @JoinToMiddle(field="id", middleField="user_id")
     * @JoinFromMiddle(middleField="role_id", field="id")
     * 
     * @AutoInsert
     * @AutoUpdate
     * @AutoSave
     * @AutoDelete
     *
     * @var \Imi\Util\ArrayList
     */
    protected $userRole;

    /**
     * Get the value of userRole
     *
     * @return  \Imi\Util\ArrayList
     */ 
    public function getUserRole()
    {
        return $this->userRole;
    }

    /**
     * Set the value of userRole
     *
     * @param  \Imi\Util\ArrayList  $userRole
     *
     * @return  self
     */ 
    public function setUserRole($userRole)
    {
        $this->userRole = $userRole;

        return $this;
    }

    /**
     * 
     *
     * @var \Imi\Util\ArrayList
     */
    protected $role;

    /**
     * Get the value of role
     *
     * @return  \ImiDemo\HttpDemo\MainServer\Model\ArrayList[]
     */ 
    public function getRole()
    {
        return $this->role;
    }

    /**
     * Set the value of role
     *
     * @param  \ImiDemo\HttpDemo\MainServer\Model\ArrayList[]  $role
     *
     * @return  self
     */ 
    public function setRole($role)
    {
        $this->role = $role;

        return $this;
    }

    // 其它这边省略……
}

查询

find

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

select

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

插入

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

更新

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

保存

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

删除

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