2017-01-13 4 views
0

Эй, как я могу установить отношения между двумя таблицами.Laravel отношения между двумя таблицами с двумя внешними ключами

Users: id, email 
Notification: id, user_id(id of the logged user), client_id(id of sender) 

Я хотел бы установить связь между пользователями и уведомлениями user_id и client_id. Тогда я могу получить все уведомления, назначенные зарегистрированному пользователю, и получить электронную почту от пользователей-отправителей.

Я сделал, что:

public function notifications_with_client() { 
    return $this->hasManyThrough('App\Models\User', 'App\Models\Notification', 'user_id', 'id', 'client_id'); 
} 

Но когда я с помощью запроса я получил хорошие уведомления, но с неправильным по электронной почте. я получил письмо от ralationship идентификатора (из таблицы пользователей) == идентификатор (из таблицы уведомлений)

Мой запрос

$column = 'notifications_with_client'; 
$value[1] = ['email', 'notifications.id', 'client_id']; 
$query->with([$column => function($query) use ($value) { 
         $query->select($value[1]); 
        }]); 

Кто-то знает, что я делаю не так?

+1

Я думаю, что вам нужно сделать многие ко многим? – Buglinjo

+0

Было бы очень полезно, если бы вы могли опубликовать, на какой модели у вас есть эти отношения. И что такое ссылка 'client_id'? Я предполагаю, что пользователи. Если это так, то у вас действительно есть отношения «многие ко многим». – devk

+0

Вы не можете использовать '$ this-> hasManyThrough()' здесь, используйте '$ this-> belongsesTo()', как я упоминал в моем ответе ниже – Gayan

ответ

1

Вы можете попробовать его, определив следующие соотношения:

User Модель

public function notifications() 
{ 
    return $this->hasMany('App\Models\Notification'); 
} 

Notification Модель

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

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

И тогда вы можете запросить его как:

$notifications = auth()->user()->notifications()->with('from')->get(); 

Или если вы просто хотите email затем запросить его как:

$notifications = auth()->user() 
        ->notifications() 
        ->with(['from' => function($q) { 
         $q->select('email'); 
        }]) 
        ->get(); 
0
public function user() 
{ 
    return $this->belongsTo(Users::class, 'user_id'); 
} 

public function client() 
{ 
    return $this->belongsTo(Users::class, 'client_id'); 
} 

С помощью этого кода в вашем Notification модели вы можете получить авторизованный пользователь с

$this->user(); // $notification->user(); 

и отправителя с

$this->client(); //$notification->client(); 
0

Вы не можете использовать $this->hasManyThrough(). Он использовать для different reason

Вы можете использовать $this->belongsTo() ,

class User extends BaseModel 
{ 
    public function user() 
    { 
     return $this->belongsTo(Notification::class, 'user_id'); 
    } 

    public function client() 
    { 
     return $this->belongsTo(Notification::class, 'client_id'); 
    } 
} 

Тогда вы можете запросить как.

User::with(['user']); 

или

User::with(['client']); 

 Смежные вопросы

  • Нет связанных вопросов^_^