如何在laravel雄辩的条件下使用

时间:2018-03-14 16:11:30

标签: laravel

我正在使用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消息。

4 个答案:

答案 0 :(得分:1)

当另一个回答所有工作时,它们要么依赖于范围(在许多情况下非常有用),要么已经实例化了$post的实例,这不会让你急于加载多个帖子他们的消息。

动态解决方案就是这样,它可以让您获取1个或更多帖子,并通过子查询急切加载他们的消息:

$posts = Post::with(['TeamMessage' => function ($query) {
    $query->where('unread', true); // This part applies to the TeamMessage query
}])->get();

See in documentation

编辑:

但是,如果您要过滤帖子,只显示包含未读邮件的帖子,则需要使用whereHas代替with

$posts = Post::whereHas(['TeamMessage' => function ($query) {
    $query->where('unread', true); // This part applies to the TeamMessage query
}])->get();

More in the documentation

您也可以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();