2016-03-05 6 views
0

Я весь этот день смутился этим. Итак, у меня есть три модели: Agent, Customer и User.Laravel: Как определить это отношение

Agent является User.

Customer также является User, но принадлежит к Agent.

User может быть Agent или Customer.

Теперь я хочу знать взаимоотношения между этими тремя моделями. Заранее спасибо за помощь.

ответ

0

Лучший способ, который я могу придумать, - использовать много-много полиморфных отношений.

Поскольку Пользователь может быть как агентом, так и клиентом, мы создадим таблицу пользователей и создадим другую таблицу, а затем назовите ее пользовательской таблицей, которая поможет отобразить пользователей как для агента, так и для клиента.

userable таблица будет иметь эти поля

user_id - integer 
userable_id - integer 
userable_type - string 

user_id проведет идентификатор пользователя, то userable_id будет содержать либо агент или идентификатор клиента и userable_type содержит имя агента или Custmoer Модель класса

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

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 

    public function agents() 
    { 
     return $this->morphedByMany('App\Agent', 'userable'); 
    } 


    public function customers() 
    { 
     return $this->morphedByMany('App\Customer', 'userable'); 
    } 
}  

Агент Модель

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Agent extends Model 
{ 

    public function users() 
    { 
     return $this->morphToMany('App\User', 'userable'); 
    } 
} 

Клиент Модель

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Customer extends Model 
{ 

    public function users() 
    { 
     return $this->morphToMany('App\User', 'userable'); 
    } 
} 
0

Возможно, это будет "чище", если User является (абстрактный) класс, и оба Agent и Customer продлить User? Тогда у вас будет два вида счетов. Тогда у вас должно быть отношение «один-ко-многим» между Agent и Customer (альтернативно, отношение «многие ко многим», если Customer может иметь более одного Agent).

Недостатком было бы то, что у вас не было бы всего одного списка, кроме двух, а Agent не может просто стать Customer, но соединения более понятны и находятся на уровне базы данных, и вам не нужно проверьте отношения на уровне приложения (например, что происходит, когда Customer, у которого есть Agent, становится Agent, есть ли Agent ->Agent отношения?).

Тогда вы также можете легко добавить дополнительные поля к Agent или Customer, не влияя друг на друга.

0

Вы не должны/не должны иметь 3 модели, но один абстрактный класс User и 2 производные классы Agent и Customer.Тогда ваши отношения довольно прямолинейны:

// Agent extends User 
public function customers() 
{ 
    return $this->hasMany(Customer::class, 'agent_id'); 
} 

// Customer extends User 
public function agent() 
{ 
    return $this->belongsTo(Agent::class, 'agent_id'); 
} 
Смежные вопросы