我正在使用laravel雄辩。我使用eloquent从两个表中获取数据。
我有post
表和chat
表。对于post
表,我有模型Post.php
,对于chat
表我有模型Chat.php
。这是我为用户的个人帖子获取聊天而创建的雄辩关系。
Post.php
中的
public function TeamMessage()
{
return $this->hasMany('App\Chat','post_id');
}
并在Chat.php
public function ChatRelation()
{
return $this->belongsTo('App\Post');
}
它完美无缺。但是这种关系会获取特定帖子的所有消息。我想从chat
表中获取所有未读消息。我在unread
表中有一个名为chat
的列。
现在我的问题是如何只为特定帖子获取unread
消息。
答案 0 :(得分:1)
当另一个回答所有工作时,它们要么依赖于范围(在许多情况下非常有用),要么已经实例化了$post
的实例,这不会让你急于加载多个帖子他们的消息。
动态解决方案就是这样,它可以让您获取1个或更多帖子,并通过子查询急切加载他们的消息:
$posts = Post::with(['TeamMessage' => function ($query) {
$query->where('unread', true); // This part applies to the TeamMessage query
}])->get();
编辑:
但是,如果您要过滤帖子,只显示包含未读邮件的帖子,则需要使用whereHas
代替with
:
$posts = Post::whereHas(['TeamMessage' => function ($query) {
$query->where('unread', true); // This part applies to the TeamMessage query
}])->get();
您也可以whereHas(...)
链接with(...)
。
答案 1 :(得分:0)
对于查询关系,您必须将它们称为函数而不是属性,如下所示:
$unreadPosts = $post->TeamMessage()->where('unread', true)->get();
有关详细信息,请查看docs。
答案 2 :(得分:0)
您需要在模型上创建本地范围,有关本地范围的信息,请访问:https://laravel.com/docs/5.6/eloquent#local-scopes
public function scopeUnread($query)
{
return $query->where('unread', 1);
}
然后在你的控制器/视图中
$unread = $yourmodel->unread()
答案 3 :(得分:0)
首先,我会将您的关系名称更改为小写的实体名称:
Post.php中的
public function chats()
{
return $this->hasMany('App\Chat','post_id');
}
在Chat.php中
public function post()
{
return $this->belongsTo('App\Post');
}
public function scopeUnread($query)
{
return $query->where('unread', 1);
}
然后你可以使用
$post->chats()->unread()->get();