Laravel Определить внешний ключ в отношениях согласно значению столбца - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть эти отношения в моем событии. Режим

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

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

Стол будет иметь поле " приглашенный , приглашающий и органайзер ».Мое требование состоит в том, чтобы иметь метод users (), где внешний ключ для assignTo будет " пригласить ", если " органайзер "! = " пригласить ", в противном случае внешний ключдолжен быть приглашающий

Заранее спасибо !!!

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Поскольку это 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;

0 голосов
/ 01 июля 2019

Спасибо, @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);
...