模型关联

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

通过预先确定好模型之间的关系,在业务开发中,使用非常简便的写法,就可以实现复杂的涉及多表数据增删改查。

这一切都是模型底层实现帮你在处理,在 imi 中,模型的关联关系都使用注解来定义。

注解

这里列出定义模型关联关系所需的注解,所有关联模型的注解,命名空间为Imi\Model\Annotation\Relation

@OneToOne

一对一关系声明

用法:

@OneToOne("模型类名")

@OneToOne(model="模型类名")

@OneToMany

一对多关系声明

用法:

@OneToMany("模型类名")

@OneToMany(model="模型类名")

@ManyToMany

多对多关系声明

用法:

@ManyToMany(model="关联模型", middle="中间模型类名", rightMany="属性名,赋值为关联的模型对象列表")

@PolymorphicOneToOne

多态一对一关系声明

用法:

@PolymorphicOneToOne(model="关联模型", type="多态类型字段名", typeValue="多态类型值")

@PolymorphicOneToMany

多态一对多关系声明

用法:

@PolymorphicOneToMany(model="关联模型", type="多态类型字段名", typeValue="多态类型值")

@PolymorphicManyToMany

多态多对多关系声明

用法:

@PolymorphicManyToMany(model="关联模型", middle="中间模型类名", rightMany="属性名,赋值为关联的模型对象列表", type="多态类型字段名", typeValue="多态类型值")

@PolymorphicToOne

用于多态一对一、一对多关联被关联的模型中使用,查询对应的左侧模型

允许出现多个,会根据typetypeValue判断,选择合适的注解配置查询模型。

用法:

@PolymorphicToOne(model="关联模型", modelField="关联的模型用于关联的字段", field="当前模型用于关联的字段", type="多态类型字段名", typeValue="多态类型值")

@PolymorphicToMany

用于多态多对多关联被关联的模型中使用,查询对应的左侧模型列表

需要和@JoinToMiddle@JoinFromMiddle配合使用

不允许出现多个!

用法:

@PolymorphicToMany(model="关联模型", modelField="关联的模型用于关联的字段", field="当前模型用于关联的字段", type="多态类型字段名", typeValue="多态类型值")

@JoinFrom

一对一、一对多声明中,指定左表与右表关联用的字段名

用法:

@JoinFrom("字段名")

@JoinFrom(field="字段名")

@JoinTo

一对一、一对多声明中,指定右表与左表关联用的字段名

用法:

@JoinTo("字段名")

@JoinTo(field="字段名")

@JoinToMiddle

多对多声明中,指定左侧模型关联到中间表模型

用法:

@JoinToMiddle(field="左侧关联字段", middleField="中间表关联字段")

@JoinFromMiddle

多对多声明中,指定中间表模型关联到右侧模型

用法:

@JoinFromMiddle(field="右侧关联字段", middleField="中间表关联字段")

@AutoSelect

指定模型查询(find、select)时,该关联属性是否自动查询出关联数据。

不写该注解,或不指定值默认为true

用法:

@AutoSelect

@AutoSelect(true)

是否总是显示该属性,如果为false,在为null时序列化为数组或json不显示该属性。默认为true

@AutoSelect(alwaysShow=false)

@AutoInsert

指定模型插入(insert、save)时,该关联属性是否自动插入关联数据。

不指定值默认为true

用法:

@AutoInsert

@AutoInsert(true)

@AutoInsert(false)

@AutoUpdate

指定模型更新(update、save)时,该关联属性是否自动更新关联数据。

不指定值默认为true

orphanRemovaltrue时,会把不包含在模型里的关联数据删除后再更新、插入关联数据。

用法:

@AutoUpdate

@AutoUpdate(true)

@AutoUpdate(false)

@AutoUpdate(orphanRemoval=true)

@AutoSave

指定模型保存(save)时,该关联属性是否自动保存关联数据。

不指定值默认为true

orphanRemovaltrue时,会把不包含在模型里的关联数据删除后再更新、插入关联数据。

用法:

@AutoSave

@AutoSave(true)

@AutoSave(false)

@AutoSave(orphanRemoval=true)

@AutoDelete

指定模型删除(delete)时,该关联属性是否自动删除关联数据。

不指定值默认为true

用法:

@AutoDelete

@AutoDelete(true)

@AutoDelete(false)

方法

查询指定关联

使用关联模型时,你可以设置注解@AutoSelect(false),让它不自动查询。在之后想要用到的时候,再手动查询。

$model->queryRelations('属性名');

// 也可以支持多个
$model->queryRelations('属性名1', '属性名2');

// 查询后可以这么获取结果
$data = $model->属性名;