【问题标题】:Multiple foreign keys referencing to one primary key多个外键引用一个主键
【发布时间】:2020-04-23 08:14:31
【问题描述】:

我已经为此苦苦挣扎了几个星期,但我似乎无法在任何地方找到答案。

我正在尝试将三个外键引用到另一个表上的一个主键中。

这里有一些信息:

用户表

|---------------------|
|        id           |
|---------------------|
|         1           |
|---------------------|
|         2           |
|---------------------|
|         3           |
|---------------------|

服务表

三个外键引用user_id的服务表

|---------------------|------------------|------------------|------------------|
|        id           |     tenant       |  service_person  |     landlord     |
|---------------------|------------------|------------------|------------------|
|         1           |        1         |         2        |         3        |
|---------------------|------------------|------------------|------------------|

用户模型

    public function service(){
        return $this->hasMany(Service::class, 'id');
    }

服务模式

    public function tenant(){
        return $this->belongsTo(User::class, 'id', 'tenant');
    }

    public function service_person(){
        return $this->belongsTo(User::class, 'id', 'service_person');
    }

    public function landlord(){
        return $this->belongsTo(User::class, 'id', 'landlord');
    }

因此,当我尝试使用 tinker 查询 User::find()->service 时,我的三个用户中只有一个找到了结果,即 service_person。其他的只是返回一个空对象。

查询结果:

>>> User::find(1)->service
=> Illuminate\Database\Eloquent\Collection {#3125
     all: [
       App\Service {#3156
         id: 1,
         tenant: 2,
         service_person: 1,
         landlord: 3
       },
     ],
   }
>>> User::find(2)->service
=> Illuminate\Database\Eloquent\Collection {#3165
     all: [],
   }
>>> User::find(3)->service
=> Illuminate\Database\Eloquent\Collection {#3166
     all: [],
   }

我想要实现的是寻找与该用户相关的所有服务,无论该用户是租户、service_guy 还是房东,我都可以在前端显示它。

知道如何实现这一目标吗?

理想情况下,我不想建立多对多关系并创建数据透视表。

提前谢谢你

【问题讨论】:

  • 您可以执行以下 Service::where('service_person', $userID) 然后获得与该服务人员相关的所有服务。
  • 在您的服务关系中,您必须指定服务表中的外键列之一。这就是为什么它只对第一个用户有效,因为两个 id 都是 1
  • 感谢您回复@Collin。我想到了 where(),但我的主要问题是让所有与使用相关的服务都经过身份验证,有点像 auth()-user()->service,显示在桌子上
  • 这样可以吗? Service::where('service_person', auth()->user()->id)
  • 是的,但是如果 service_person 是房东和租户怎么办。我想要实现的是寻找与该用户相关的所有服务,无论该用户是租户、service_guy 还是房东

标签: php mysql laravel laravel-5 eloquent


【解决方案1】:

我认为问题在于 User 模型的关系:

用户模型:

public function servicesTenants(){
return $this->hasMany(Service::class, 'tenant');
}
public function servicesPerson(){
return $this->hasMany(Service::class, 'service_person');
}
public function servicesLandlord(){
return $this->hasMany(Service::class, 'landlord');
}

现在,你可以试试:

$user=User::with(['servicesLandlord','servicesPerson','servicesTenants'])->find($user_id);

如果您想获得所有 user 的服务而不管关系如何,您可以尝试:

$userServices=Service::where('tenant',$user_id)->orWhere('service_person',$user_id)->
orWhere('landlord',$user_id)->get();

【讨论】:

  • 我的朋友做得很好,感谢磨坊。救了我的命
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2012-07-02
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
相关资源
最近更新 更多