Запрос Laravel, а также проверка логического значения одновременно в одном запросе

У меня есть четыре модели: пользователь, вопрос, ответ и голосование. Модели удовлетворяют следующим ограничениям:

  • Пользователь может задавать много вопросов.
  • У вопроса много ответов
  • Ответ относится к одному вопросу.
  • У ответа есть много голосов за, а также голосов против

(так же, как простой сайт ответов на вопросы)

Вот запрос, который я написал:

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 показывает, что уже понравился пост с цветом). Как этого можно было добиться?

(если никто не вошел в систему, то нечего проверять. если пользователь вошел в систему, я хочу просто получить еще одну вещь, которая является истинной или ложной для каждой строки после присоединения)

Я не знаю, как добавить эту логику проверки, проголосовал ли пользователь, а затем получить истину или ложь.


person waq    schedule 16.02.2018    source источник


Ответы (1)


Учитывая Answer:

$answer = Answer::find(1);

Вы можете искать с идентификатором аутентифицированного пользователя, например:

$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();
person Community    schedule 16.02.2018
comment
привет @btl спасибо, я хочу получить ответ "истина" или "ложь" с запросом, который я написал в вопросе, а не отдельно. я хочу получить с вопросами и ответить, когда я присоединяюсь к ним всем. Я не хочу получать количество голосов за и против, но истинное или ложное для этого пользователя, который вошел в систему - person waq; 17.02.2018