模型关联
通过预先确定好模型之间的关系,在业务开发中,使用非常简便的写法,就可以实现复杂的涉及多表数据增删改查。
这一切都是模型底层实现帮你在处理,在 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
用于多态一对一、一对多关联被关联的模型中使用,查询对应的左侧模型
允许出现多个,会根据type
和typeValue
判断,选择合适的注解配置查询模型。
用法:
@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
当orphanRemoval
为true
时,会把不包含在模型里的关联数据删除后再更新、插入关联数据。
用法:
@AutoUpdate
@AutoUpdate(true)
@AutoUpdate(false)
@AutoUpdate(orphanRemoval=true)
@AutoSave
指定模型保存(save)时,该关联属性是否自动保存关联数据。
不指定值默认为true
当orphanRemoval
为true
时,会把不包含在模型里的关联数据删除后再更新、插入关联数据。
用法:
@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->属性名;