一对一关联

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

比如我们有一个用户表,另外有一个个人资料表,他们之间的关联就是一对一的关系。

定义

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

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

如 imi-demo 中代码所示,定义了一个$ex属性,这个属性关联UserEx模型。

UseridUserExuser_id关联。

允许自动查询、保存、删除时,自动处理UserEx模型数据。

/**
 * 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
{
    /**
     * @OneToOne("UserEx")
     * @JoinFrom("id")
     * @JoinTo("user_id")
     * @AutoSave(true)
     * @AutoDelete
     *
     * @var \ImiDemo\HttpDemo\MainServer\Model\UserEx
     */
    protected $ex;

    /**
     * Get the value of ex
     *
     * @return  \ImiDemo\HttpDemo\MainServer\Model\UserEx
     */ 
    public function getEx()
    {
        return $this->ex;
    }

    /**
     * Set the value of ex
     *
     * @param  \ImiDemo\HttpDemo\MainServer\Model\UserEx  $ex
     *
     * @return  self
     */ 
    public function setEx(\ImiDemo\HttpDemo\MainServer\Model\UserEx $ex)
    {
        $this->ex = $ex;

        return $this;
    }

    // 其它这边省略……

查询

find

$model = User::find(1);
var_dump($model->ex); // ex数据可以直接取到,是UserEx实例

select

$list = User::select();
foreach($list as $item)
{
    var_dump($item->ex); // ex数据可以直接取到,是UserEx实例
}

插入

$user = User::newInstance();
$user->username = 'User123';

// 对UserEx实例赋值
$user->ex->intro = '这个人很懒,什么也没留下';

// 一句话,数据插入两张表
$result = $user->insert();

var_dump($result->getLastInsertId());

更新

$user = User::find(1);
$user->ex->intro = '这个人很懒,什么也没留下-' . date('Y-m-d H:i:s');

// 更新ID为1的记录
// 对User对象执行update,同时也会让UserEx做update
$result = $user->update();

保存

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

删除

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