【问题标题】:Laravel query as well as check for boolean at the same time in same queryLaravel 查询以及在同一查询中同时检查布尔值
【发布时间】:2018-07-27 18:10:44
【问题描述】:

我有四个模型:用户、问题、答案和支持。模型满足以下约束:

  • 用户可以提出许多问题
  • 一个问题有很多答案
  • 一个答案属于一个问题
  • 答案有很多赞成和反对

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

这是我写的查询:

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 - 赞成
  • 2 - 否决

我的答案模型

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);
}

支持模型

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

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

我想添加的是当前登录的用户是否对特定答案投了赞成票。 (就像 facebook 节目已经在带有颜色的帖子上喜欢)。如何实现?

(如果没有人登录,则无需检查。如果用户已登录,那么我只想在加入后的每一行中再得到一件对或错的东西)

我不知道如何添加这个检查逻辑,无论用户是否投票,然后得到真或假。

【问题讨论】:

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


    【解决方案1】:

    给定一个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();
    

    【讨论】:

    • 嗨@btl 谢谢,我想用我在问题中写的查询来投票赞成或否决,而不是分开。当我加入他们所有人时,我想得到问题和答案。我不想获得赞成票反对票数,但对于已登录的用户来说是真或假
    猜你喜欢
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多