Laravel查询以及在同一查询中同时检查布尔值

时间:2018-02-16 19:17:52

标签: mysql laravel laravel-eloquent laravel-query-builder

我有四个模型:用户,问题,答案和Upvote。模型满足以下约束条件:

  • 用户可以提出许多问题
  • 问题有很多答案
  • 回答属于单个问题
  • 回答还有很多 upvotes 和downvotes

(就像一个简单的问题答案网站)

这是我写的查询:

DB::table('questions')
    ->join('answers', 'answers.question_id', '=', 'questions.id')
    ->join('users', 'users.id', '=', 'answers.user_id')
    ->select('answers.answer_content as answer_content',
             'answers.created_at as created_at',
             'users.name as name',
             'users.id as u_id',
             'users.user_slug as user_slug'
           )
    ->orderBy('answers.created_at', 'desc')
    ->get();

Upvotes表包含列:

user_id, answer_id, upvote(booolean 1 or 0) 
  • 1 - upvoted
  • 2 - downvoted

我的答案模式

public function upvote()
{
    return $this->hasMany('App\Upvote', 'answer_id')->where('upvote', 1);
}

public function downvote()
{
    return $this->hasMany('App\Upvote', 'answer_id')->where('upvote', 0);
}

Upvote模型

public function answer()
{
    return $this->belongsTo('App\Answer', 'id');
}

它为我提供了三个表用户,问题和答案的预期结果。

我想要添加的内容是当前登录的用户是否对其进行了特定的回答。 (就像Facebook的节目已经在一个有颜色的帖子上喜欢)。如何实现这一目标?

(如果没有人登录,则无需检查。如果用户已登录,那么我想在加入后再获得一行真或假的每一行)

我不知道如何添加此检查逻辑是否用户已经upvoted然后得到true或false。

1 个答案:

答案 0 :(得分:0)

给出Answer

$answer = Answer::find(1);

您可以使用经过身份验证的用户ID进行搜索:

$user = $answer->upvotes()->where('user_id', auth()->id())->first();

if ($user) {
    // user has voted
} else {
    // user has not voted
}

或者另一种方式是:

$upvote = Upvote::where(['answer_id' => $answer->id, 'user_id' => auth()->id()])->first();
相关问题