Laravel根据列值定义关系中的外键

时间:2019-04-25 10:32:27

标签: laravel eager-loading

我在事件模式下拥有这些关系

public function invited()
    {
        return $this->belongsTo('App\Models\User', 'invitee');
    }

        public function senter()
    {
        return $this->belongsTo('App\Models\User', 'invitor');
    }

表将具有“ 受邀者邀请者组织者”的名称。我的要求是要有一个方法users(),如果“ 组织者”!=“ = 受邀者”,则belongTo的外键将为“ 受邀者”否则外键应为邀请者

提前谢谢!

2 个答案:

答案 0 :(得分:1)

由于您寻求的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;

答案 1 :(得分:0)

谢谢@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);