Laravel 根据列值定义关系中的外键
Laravel Define foreign key in relationship according to column value
我的活动模式中有这些关系
public function invited()
{
return $this->belongsTo('App\Models\User', 'invitee');
}
public function senter()
{
return $this->belongsTo('App\Models\User', 'invitor');
}
Table 将拥有“受邀者、邀请者 和组织者 ”。我的要求是有一个 users() 方法,其中 belongsTo 的外键将是 "invitee" if "organiser" != "invitee" 否则外键应该是 invitor
提前致谢!!!
由于您寻求的这个 user()
是从其他关系派生而来的,因此将其作为普通方法(而不是关系)或属性可能是个好主意。
普通方法
public function user(){
if($this->organiser->id == $this->invited->id){
return $this->invited;
}
else{
return $this->senter;
}
}
用法示例:Event::with('organizer', 'invited', 'senter')->find(2)->user();
属性方法
public function getUserAttribute(){
if($this->organiser->id == $this->invited->id){
return $this->invited;
}
else{
return $this->senter;
}
}
用法示例:Event::with('organizer', 'invited', 'senter')->find(2)->user;
谢谢,@Augusto Moura,但我找到了另一种解决方案,它实际上不是最好的解决方案,但对我有用,这样我就可以从事件模型中调用用户,也可以将用户作为嵌套关系调用。
public function users()
{
return $this->hasMany('App\Models\Invitation', 'round_id')
->select('users.*', 'round_invitations.round_id', 'round_invitations.accept_status', 'round_invitations.reservation', 'round_invitations.id as request_id', 'users.id as user_id')
->join('users', function ($join) {
$join->on('users.id', '=', 'round_invitations.invitee')->whereColumn('users.id', 'round_invitations.invitee');
$join->orOn('users.id', '=', 'round_invitations.invitor')->whereColumn('users.id', 'round_invitations.invitor');
})->where(function ($query) {
$query->where('accept_status', 1)->orWhere('reservation', 1);
})->where('accept_status', '!=', 2)
->groupBy('round_invitations.id')
->whereColumn('users.id', '!=', 'organiser_id')
->groupBy('user_id')
->distinct('users.id');
}
Usage example: Event::with('user')->find(2);
Another example: Organiser::with('Events.user')->find(2);
我的活动模式中有这些关系
public function invited()
{
return $this->belongsTo('App\Models\User', 'invitee');
}
public function senter()
{
return $this->belongsTo('App\Models\User', 'invitor');
}
Table 将拥有“受邀者、邀请者 和组织者 ”。我的要求是有一个 users() 方法,其中 belongsTo 的外键将是 "invitee" if "organiser" != "invitee" 否则外键应该是 invitor
提前致谢!!!
由于您寻求的这个 user()
是从其他关系派生而来的,因此将其作为普通方法(而不是关系)或属性可能是个好主意。
普通方法
public function user(){
if($this->organiser->id == $this->invited->id){
return $this->invited;
}
else{
return $this->senter;
}
}
用法示例:Event::with('organizer', 'invited', 'senter')->find(2)->user();
属性方法
public function getUserAttribute(){
if($this->organiser->id == $this->invited->id){
return $this->invited;
}
else{
return $this->senter;
}
}
用法示例:Event::with('organizer', 'invited', 'senter')->find(2)->user;
谢谢,@Augusto Moura,但我找到了另一种解决方案,它实际上不是最好的解决方案,但对我有用,这样我就可以从事件模型中调用用户,也可以将用户作为嵌套关系调用。
public function users()
{
return $this->hasMany('App\Models\Invitation', 'round_id')
->select('users.*', 'round_invitations.round_id', 'round_invitations.accept_status', 'round_invitations.reservation', 'round_invitations.id as request_id', 'users.id as user_id')
->join('users', function ($join) {
$join->on('users.id', '=', 'round_invitations.invitee')->whereColumn('users.id', 'round_invitations.invitee');
$join->orOn('users.id', '=', 'round_invitations.invitor')->whereColumn('users.id', 'round_invitations.invitor');
})->where(function ($query) {
$query->where('accept_status', 1)->orWhere('reservation', 1);
})->where('accept_status', '!=', 2)
->groupBy('round_invitations.id')
->whereColumn('users.id', '!=', 'organiser_id')
->groupBy('user_id')
->distinct('users.id');
}
Usage example: Event::with('user')->find(2);
Another example: Organiser::with('Events.user')->find(2);