Laravel查询一对多关系

时间:2017-12-10 07:03:12

标签: php laravel laravel-5

我有PostComment个型号。 PostComment具有一对多的关系,因此一个帖子可以有很多评论。每个评论都有一个用户外地字段(UserComment也有一对多)。

我想获得特定用户评论的帖子。我们可以假设,用户只能在帖子上写一次评论。

4 个答案:

答案 0 :(得分:0)

您可以使用Has Many Through关系。 “has-many-through”关系提供了通过中间关系访问远程关系的便捷捷径。

class User extends Model
{
    public function posts()
    {
        return $this->hasManyThrough('App\Post', 'App\Comment');
    }
}

现在,您可以通过访问此$user->posts

来获取用户评论的所有帖子

答案 1 :(得分:0)

您可以为帖子和用户模型添加其他关系。

class User extends Model {
// add this to connect your user to your post through the comment 
// (assuming one to many relationship between Comment and Post is working well)
  public function posts()
  {
     return $this->hasManyThrough(Post::class, Comment::class);
  }
}

因此,您可以使用此$user->posts()->get()

获取特定用户评论过的帖子

您可以阅读有关HasManyThrough here

的更多信息

答案 2 :(得分:0)

假设您应用中的用户可以创建帖子以及评论其他用户创建的帖子,您可以将关系设置为在:

用户模型

namespace App;

use App\Post;
use App\Comment;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function commentedPosts()
    {
        $posts = Post::whereHas('comments', function ($query){
            $query->whereUserId($this->id);
        })->get();
        return $posts;
    }
}  

后期模型

namespace App;

use App\Comment;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

评论模型

namespace App;

use App\Post;
use App\User;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

然后要获得用户评论的帖子,您可以使用

$user->commentedPosts();

答案 3 :(得分:-1)

我认为这可以帮到你:

Post::whereHas('comments', function($q) use($userId){
$q->whereHas('user', function($qq) use ($userId)
{
    $qq->where('id',$userId);
}})->get();

当我们加载相关模型时,我们可以使用函数whereHas如果我们想要通过相关模型过滤查询。所以这里我们有Post-> Comment-> User。我们希望由特定用户制定标准。所以在这个例子中,我传递两次变量$ userId,关键字为“use”,所以我可以在内部闭包中使用它。我还传递第一个变量$ q,意思是它的注释查询,所以我可以按任何注释规则进行过滤。我再次使用相同的。 'comments'和'user'必须是你的关系函数的名称,所以如果在你的帖子模型中你有任何不同的函数评论来返回评论和帖子你应该更改'评论'到你的函数名称,也为'用户'