Laravel 9.*:能否通过belongsToMany从User模型访问Property模型?
问题解答
数据库结构
user user_id office office_id property property_id office_user office_user_id office_id user_id office_user_property office_user_id property_id
能否通过belongsToMany关联从User模型直接访问Property模型?
直接用belongsToMany做不到。因为belongsToMany是用来处理两个模型之间直接的多对多关联,要求必须有一张只包含两个关联模型主键的中间表。但你的结构里,User和Property之间没有这样的直接中间表——两者是通过office_user和office_user_property两张表间接关联的,中间隔了office_user这一层。
要实现从User访问关联的Property,你可以通过嵌套关联或者自定义查询的方式来处理,举个Laravel框架下的实现示例:
1. 定义嵌套关联
首先在模型里定义层级关联:
User模型
class User extends Model { // 用户关联多个office_user记录 public function officeUsers() { return $this->hasMany(OfficeUser::class, 'user_id'); } }
OfficeUser模型
class OfficeUser extends Model { // 单个office_user关联多个property public function properties() { return $this->belongsToMany(Property::class, 'office_user_property', 'office_user_id', 'property_id'); } }
之后你可以通过嵌套调用获取:
// 获取用户的所有关联property(去重处理) $properties = $user->officeUsers->flatMap(function ($officeUser) { return $officeUser->properties; })->unique('property_id');
2. 自定义便捷方法
在User模型里直接写一个封装好的方法,简化调用:
class User extends Model { public function properties() { return Property::whereHas('officeUsers', function ($query) { $query->where('user_id', $this->user_id); }); } }
这样直接调用$user->properties就能拿到所有关联的Property集合了。
内容的提问来源于stack exchange,提问作者Валерий Новожилов
相关产品推荐
相关产品推荐

