Несколько внешних ключей, ссылающихся на один первичный ключ - PullRequest
0 голосов
/ 23 апреля 2020

Я боролся с этим пару недель и, похоже, нигде не могу найти ответ.

Я пытаюсь сослаться на три внешних ключа в один первичный ключ в другой таблице.

Вот некоторая информация:

Таблица пользователей

|---------------------|
|        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');
    }

Итак когда я пытаюсь сделать запрос с User::find()->service с помощью tinker, только один из трех моих пользователей находит результаты, это 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 или арендодателем, поэтому я могу показать его на внешнем интерфейсе.

Есть идеи, как мне этого добиться?

В идеале я не знаю Я хочу создать отношения «многие ко многим» и создать сводную таблицу.

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

1 Ответ

0 голосов
/ 23 апреля 2020

Я думаю, что проблема в отношениях модели пользователя:

Модель пользователя:

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

, если Вы хотите получить все пользовательские услуги независимо от отношения, которое вы можете попробовать:

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