雄辩地查询1:n关系

时间:2015-07-24 13:40:05

标签: php mysql laravel eloquent

我的数据库中有2个表,notifications表和notifications_user表。

通知可以包含许多通知用户。我的通知模型中的结果我有以下关系,

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关系中的值选择表中的所有数据。

3 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作来查询关系:

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

检查文档:http://laravel.com/docs/5.1/eloquent-relationships#querying-relations

答案 1 :(得分:0)

因此,虽然通知拥有许多用户的关系可能是有意义的,但它确实对所有权没有意义。当用户以某种方式持续时,通知是一次性的事情。因此,请尝试将用户视为基础对象,并将通知视为丰富的资源。

此处的目标是获取用户通知,因此您必须选择是为每个用户复制通知还是为许多用户提供一个通知。在一种情况下,它是通用通知(可能是管理面板),另一种是用户个人通知。如果你正在做后者,你真的不需要数据透视表和通知表。

User -> hasOne -> Notification

Notification -> belongsTo -> User

这使您可以真正自定义 per-user 通知,而不是依赖于另一个表来读取通知,您可以将其标记为" read"在行中。

如果您需要通用通知,结构只会实现第三个名为 pivot 的表,如您所知。 (我注意到你的课程名称是多元化的,不推荐使用)

User -> Notification_User -> Notification

为方便起见,您也可以自行软删除notification_user行或通知。你可以简单地说 - > withTrashed() - > limit(x)来获取先前的通知。

这确实简化了数据库和代码所做的工作。个人通知允许您通过创建/更新进行订购,并以两种方式处理读取:软删除和 IsRead 变量。

您的代码变得如此简单。

Auth::user()->notifications()

您的User类具有以下内容(假设标准命名方案)

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

Notification类具有反向

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

如果出于某种原因,您需要全面了解所有未读通知,只需查询通知表。

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

或者,您可以在这种情况下为用户延迟加载每个通知或组的用户,无论您需要什么目的。

如果这对您的解决方案有帮助,您可以将其标记为答案吗?

答案 2 :(得分:0)

您可以使用laravel提供的wherePivotorWherePivot函数进行关系。 Link