2015-07-24 5 views
1

У меня есть 2 таблицы в моей базе данных, таблица notifications и таблица notifications_user.Eloquent querying 1: n relationship

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

public function user() 
{ 
    return $this->belongsToMany('User')->withPivot('is_read'); 
} 

То, что я хотел добиться того, чтобы получить все уведомления, которые являются непрочитанными (или is_read = 0), то is_read столбец в таблице пользовательского уведомления хотя, и я не могу решить, как запустить запрос на нем, потому что это можно сделать.

тока у меня есть это,

$unread = Notification::has('user')->with('user')->get(); 

Теперь это тянет отношения в результатах, но не принимает во внимание is_read значения.

Есть ли способ выбрать все данные из таблицы на основе значения в его соотношении 1: n.

ответ

1

Вы можете запросить на отношения, делая что-то вроде:

$unread = Notification::has('user')->with('user')->where('is_read','!=', 0)->get(); 

Проверьте документы: http://laravel.com/docs/5.1/eloquent-relationships#querying-relations

+0

Я получаю следующее сообщение об ошибке, SQLSTATE [42S22]: Column не найдено: 1054 Неизвестный столбец 'is_read' в 'где предложение' (SQL: SELECT * FROM 'notifications' где (SELECT COUNT (*) из' user' inner join 'notification_user' на' users'.'id' = 'notification_user'.'user_id' где' notification_user'.'notification_id' = 'уведомления'.' '')> = 1 и 'is_read' = 0) который я предполагаю, потому что он ищет is_read в таблице уведомлений, а не в таблице notification_user – Udders

+0

Вы можете указать таблицу: '-> где ('notification_user.is_read'' –

0

Таким образом, хотя это может иметь смысл иметь отношение, что уведомления есть много пользователей, это действительно Безразлично» t имеет смысл от владения. Уведомления являются разовыми вещами, в то время как пользователи сохраняют в некотором смысле. Поэтому старайтесь думать о пользователях как о базовом объекте и уведомлениях как о богатом ресурсе.

Целью здесь является получение уведомлений пользователей, поэтому из этого вы должны выбрать, нужно ли дублировать уведомления для каждого пользователя или иметь одно уведомление для многих пользователей. В одном случае, когда это универсальные уведомления (возможно, панель администратора), а другая - уведомления, которые являются персональными для пользователя. Если вы делаете последнее, вам не нужна сводная таблица и только таблица уведомлений.

User -> hasOne -> Notification 

Notification -> belongsTo -> User 

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

Если вам нужны универсальные уведомления, структура просто реализует третий стол, который называется pivot, как вы знаете. (Я заметил, у вас есть имена классов множественных, которые не рекомендуются)

User -> Notification_User -> Notification 

Для удобства вы также можете просто мягкой удалить в notification_user строку или уведомления сами. Вы можете просто сказать -> withTrashed() -> limit (x), чтобы получать предыдущие уведомления.

Это действительно упрощает работу, выполняемую БД и вашим кодом. Личные уведомления позволяют вам создавать, обновлять и обрабатывать чтение двумя способами: с мягким удалением и переменными IsRead.

Ваш код будет таким же простым, как этот.

Auth::user()->notifications() 

Ваш класс Пользователь имеет следующие (предполагая, что стандартные схемы именования)

public function notifications() 
{ 
    //You're free to append other requirements here 
    return $this->hasMany('App\Notification','id','user_id'); 
} 

Класс Уведомление имеет обратную

public function user() 
{ 
    //You're free to append other requirements here 
    return $this->belongsTo('App\User','user_id','id'); 
} 

Если по какой-то причине вам требуется знать все непрочитанные уведомления повсеместно запрашивать таблицу уведомлений.

Notification::where('isRead','null')->get(); 

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

Если это помогло вам в решении, можете ли вы пометить его как ответ?

0

Вы можете использовать функции wherePivot и orWherePivot, предоставляемые laravel для отношений. Link

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