ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
多态一对一相比多态一对多关联的区别是动态的一对一关联,举个例子说有一个个人和团队表,而无论个人还是团队都有一个头像需要保存但都会对应同一个头像表 ~~~ member id - integer name - string team id - integer name - string avatar id - integer avatar - string imageable_id - integer imageable_type - string ~~~ ## 关联定义 会员模型: ~~~ <?php namespace app\model; use think\Model; class Member extends Model { /** * 获取用户的头像 */ public function avatar() { return $this->morphOne(Avatar::class, 'imageable'); } } ~~~ 团队模型: ~~~ <?php namespace app\model; use think\Model; class Team extends Model { /** * 获取团队的头像 */ public function avatar() { return $this->morphOne(Avatar::class, 'imageable'); } } ~~~ `morphOne`方法的参数如下: >[info] ### morphOne('关联模型','多态字段','多态类型'); **关联模型**(必须):关联的模型类名。 **多态字段**(可选):支持两种方式定义 如果是字符串表示多态字段的前缀,多态字段使用 `多态前缀_type`和`多态前缀_id`,如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀。 **多态类型**(可选):当前模型对应的多态类型,默认为当前模型名,可以使用模型名(如`Member`)或者完整的命名空间模型名(如`app\index\model\Member`)。 下面是头像模型的关联定义: ~~~ <?php namespace app\model; use think\Model; class Avatar extends Model { /** * 获取头像对应的多态模型。 */ public function imageable() { return $this->morphTo(); } } ~~~ 理解了多态一对多关联后,多态一对一关联其实就很容易理解了,区别就是当前模型和动态关联的模型之间的关联属于一对一关系。 ## 绑定属性到父模型(`V2.0.40+`) 可以在定义关联的时候使用`bind`方法绑定属性到父模型,例如: ~~~ <?php namespace app\model; use think\Model; class Team extends Model { /** * 获取团队的头像 */ public function avatar() { return $this->morphOne(Avatar::class, 'imageable')->bind(['nickname', 'email']); } } ~~~ 或者指定绑定属性别名 ~~~ <?php namespace app\model; use think\Model; class Team extends Model { /** * 获取团队的头像 */ public function avatar() { return $this->morphOne(Avatar::class, 'imageable')->bind([ 'email', 'truename' => 'nickname', ]); } } ~~~ 然后使用关联预载入查询的时候,可以使用 ~~~ $team = Team::with('avatar')->find(1); // 直接输出Avatar关联模型的绑定属性 echo $team->email; echo $team->truename; ~~~ 绑定关联模型的属性支持读取器。