php 雄辩地查询1:n关系

bejyjqdl  于 2023-05-27  发布在  PHP
关注(0)|答案(3)|浏览(120)

我的数据库中有两个表,一个是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关系中的值从表中选择所有数据。

oxcyiej7

oxcyiej71#

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

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

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

kognpnkq

kognpnkq2#

你可以使用laravel提供的wherePivotorWherePivot函数来处理关系。联系方式

xt0899hw

xt0899hw3#

因此,尽管通知具有许多用户的关系可能是有意义的,但从所有权来看,这真的没有意义。通知是一次性的,而用户以某种方式 * 坚持 *。因此,尝试将用户视为基本对象,将通知视为丰富的资源。
这里的目标是获取用户通知,因此您必须选择是否为每个用户重复通知,还是为多个用户提供一个通知。在一种情况下,它是通用的通知(管理面板可能),另一种是对用户个人的通知。如果你做的是后者,你实际上不需要透视表,而只需要一个通知表。

User -> hasOne -> Notification

Notification -> belongsTo -> User

这使您能够真正自定义通知 * 每个用户 *,而不是依赖于另一个表来读取通知,您只需在行中将其标记为“已读”。
然而,如果你需要通用通知,这个结构只实现了第三个表,称为 pivot,正如你所知。(我注意到你的类名是复数的,这是不推荐的)

User -> Notification_User -> Notification

为了方便起见,您还可以软删除notification_user行或notification本身。你可以简单地说->withTrashed()->limit(x)来获取以前的通知。
这确实简化了DB和代码所做的工作。个人通知允许您通过创建/更新进行排序,并以两种方式处理读取,软删除和 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表即可。

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

或者,在这种情况下,您可以根据用户为每个通知或组延迟加载用户,以满足您需要的任何目的。

相关问题