获取关系中的用户记录

时间:2016-09-21 05:05:36

标签: laravel laravel-5 laravel-5.3

我有3张桌子:

  1. users
  2. posts表(用户可以有很多帖子)
  3. likes表(与Facebook喜欢的方式相同)
  4. 我有以下关系:

    user.php的

    public function posts()
    {
        return $this->hasMany('App\Post');
    }
    

    post.php中

    public function user()
    {
        return $this->belongsTo('App\User');
    }
    
    public function likes()
    {
        return $this->hasMany('App\Like');
    }
    

    Like.php

    public function post()
    {
        return $this->belongsTo('App\Post');
    }
    

    要获得所有帖子,我会这样做:

    $posts = Post::with('likes')
        ->get();
    

    但是,这会返回与帖子关联的所有相似内容(我不想要)。我需要做的是检查登录用户是否喜欢每个帖子。

    例如,在我看来,我有:

    @foreach ($posts as $post)
        // check if logged in user liked the $post
    @endforeach
    

    如何修改我的代码,以便我可以检查用户是否喜欢每个帖子,如何通过简单地添加新关系来执行此操作?

3 个答案:

答案 0 :(得分:0)

首先,您需要在用户和喜欢之间建立关系

用户模型

public function likes() {
    return $this->hasMany('App\Like');
}

赞模特

public function user() {
    return $this->belongsTo('App\User');
}

发布模型

public function isLiked() {
    return (bool) $this->likes()->where('user_id', Auth::user()->id)->first(); 
    // Will return true if liked by the logged in user
}

现在你可以像这样使用它:

if ( $post->isLiked() ) {
    // Do something
}

答案 1 :(得分:0)

我非常确定你在Post with Likes和Post with User models之间建立了关系

所以...在Post模型中创建公共函数,我认为你有像 post_id user_id 这样的字段来保留喜欢的内容。

发布模型:

public function likes()
{
    return $this->belongsTo('App\Like', 'post_id);
}

之后在你的控制器中进行查询以获取帖子

后置控制器

 $post = Post::all();

并在模板中,您可以检查user_id是否在此帖子中

发布视图

foreach($post as $p) {
  if($logged_user_id === $p->like()->user_id) {
    echo 'liked';
  } else {
   echo 'not liked';
  }
}

答案 2 :(得分:0)

我认为这会对你有帮助,(步骤1)

    $post = Post::with(['Like.User' => function ($query) {
        $query->where('users.id', '=', Auth::user()->id);
    }])->get();       

注意: - 用户是表名。   它将为所有帖子和所有喜欢的用户登录。

另一个解决方案,它将返回与用户特定喜欢(喜欢由auth用户)的所有帖子。 (步骤2)

     foreach ($post as $item) {
        $like = $item->Like;
        foreach ($like as $key => $user){
            if(count($user->User) == 0){
                unset($like[$key]);
            }
        }
    }         

结果将针对第1步: -

     [
       {
         "post" : "details",
         "like" : [ { 
                    "post_id" : 1,
                    "user_id" : 1 },
                    { 
                    "post_id" : 1,
                    "user_id" : null }],
       {
         "post" : "details",
         "like" : [] }
     ]

结果将是第2步: -

     [
       {
         "post" : "details",
         "like" : [ { 
                    "post_id" : 1,
                    "user_id" : 1 }],
       {
         "post" : "details",
         "like" : []  }
     ]        

结果关键字是假设,期望是post和user表中的user_id,post_id在like表中。