libarea/app/Models/AnswerModel.php

325 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Models;
use Hleb\Constructor\Handlers\Request;
use App\Models\PostModel;
use UserData;
use DB;
class AnswerModel extends \Hleb\Scheme\App\Models\MainModel
{
// Add an answer
// Добавим ответ
public static function add($post_id, $content, $trigger)
{
$params = [
'answer_post_id' => $post_id,
'answer_content' => $content,
'answer_published' => ($trigger === false) ? 0 : 1,
'answer_ip' => Request::getRemoteAddress(),
'answer_user_id' => UserData::getUserId(),
];
$sql = "INSERT INTO answers(answer_post_id,
answer_content,
answer_published,
answer_ip,
answer_user_id)
VALUES(:answer_post_id,
:answer_content,
:answer_published,
:answer_ip,
:answer_user_id)";
DB::run($sql, $params);
$sql_last_id = DB::run("SELECT LAST_INSERT_ID() as last_id")->fetch();
// Recalculating the number of responses for the post + 1
// Пересчитываем количество ответов для поста + 1
PostModel::updateCount($post_id, 'answers');
return $sql_last_id['last_id'];
}
// Editing the answer
// Редактируем ответ
public static function edit($params)
{
$sql_two = "UPDATE answers SET answer_content = :answer_content,
answer_modified = :answer_modified, answer_user_id = :answer_user_id
WHERE answer_id = :answer_id";
return DB::run($sql_two, $params);
}
// All answers
// Все ответы
public static function getAnswers($page, $limit, $sheet)
{
$user_id = UserData::getUserId();
$sort = self::sorts($sheet);
$start = ($page - 1) * $limit;
$sql = "SELECT
post_id,
post_title,
post_slug,
post_user_id,
post_closed,
post_feature,
post_is_deleted,
answer_id,
answer_content,
answer_date,
answer_after,
answer_user_id,
answer_ip,
answer_post_id,
answer_votes,
answer_is_deleted,
answer_published,
votes_answer_item_id,
votes_answer_user_id,
fav.tid,
fav.user_id,
fav.action_type,
u.id,
u.login,
u.avatar
FROM answers
INNER JOIN users u ON u.id = answer_user_id
INNER JOIN posts ON answer_post_id = post_id
LEFT JOIN votes_answer ON votes_answer_item_id = answer_id
AND votes_answer_user_id = $user_id
LEFT JOIN favorites fav ON fav.tid = answer_id
AND fav.user_id = $user_id
AND fav.action_type = 'answer'
$sort
ORDER BY answer_id DESC LIMIT :start, :limit ";
return DB::run($sql, ['start' => $start, 'limit' => $limit])->fetchAll();
}
public static function getAnswersCount($sheet)
{
$sort = self::sorts($sheet);
$sql = "SELECT answer_id FROM answers INNER JOIN posts ON answer_post_id = post_id $sort";
return DB::run($sql)->rowCount();
}
public static function sorts($sheet)
{
$hidden = UserData::checkAdmin() ? "" : "AND post_hidden = 0";
switch ($sheet) {
case 'all':
$sort = "WHERE answer_is_deleted = 0 AND post_tl = 0 AND post_is_deleted = 0 $hidden";
break;
case 'deleted':
$sort = "WHERE answer_is_deleted = 1";
break;
}
return $sort;
}
// Number of replies per post
// Количество ответов на пост
public static function getNumberAnswers($post_id)
{
$sql = "SELECT answer_id FROM answers WHERE answer_post_id = :id AND answer_is_deleted = 0";
return DB::run($sql, ['id' => $post_id])->rowCount();
}
// Add the answer to the end of the post
// Добавим ответ в конец поста
public static function mergePost($post_id, $content)
{
$sql = "UPDATE posts SET post_content = CONCAT(post_content, :content) WHERE post_id = :post_id";
$content = "\n\n `+` " . $content;
return DB::run($sql, ['post_id' => $post_id, 'content' => $content]);
}
// Getting answers in a post
// Получаем ответы в посте
public static function getAnswersPost($post_id, $type, $sorting = 'new')
{
$user_id = UserData::getUserId();
if ($type == 1) {
$sorting = 'top';
}
switch ($sorting) {
case 'top':
$sort = 'ORDER BY answer_lo DESC, answer_votes DESC';
break;
case 'old':
$sort = 'ORDER BY answer_id DESC';
break;
// new
default:
$sort = '';
break;
}
// TODO: Сгруппировать комментарии по ответу (избавимся N+1)
// LEFT JOIN comments ON comment_answer_id = answer_id
// comment_answer_id,
// comment_user_id,
// comment_date,
// comment_ip,
// comment_content,
$sql = "SELECT
answer_id,
answer_user_id,
answer_post_id,
answer_date,
answer_content,
answer_modified,
answer_published,
answer_ip,
answer_votes,
answer_after,
answer_lo,
answer_is_deleted,
votes_answer_item_id,
votes_answer_user_id,
fav.tid,
fav.user_id,
fav.action_type,
u.id,
u.login,
u.avatar,
u.created_at
FROM answers
LEFT JOIN users u ON u.id = answer_user_id
LEFT JOIN votes_answer ON votes_answer_item_id = answer_id
AND votes_answer_user_id = $user_id
LEFT JOIN favorites fav ON fav.tid = answer_id
AND fav.user_id = $user_id
AND fav.action_type = 'answer'
WHERE answer_post_id = $post_id
$sort ";
return DB::run($sql)->fetchAll();
}
// User responses
// Ответы участника
public static function userAnswers($page, $limit, $user_id, $uid_vote)
{
$start = ($page - 1) * $limit;
$sql = "SELECT
answer_id,
answer_user_id,
answer_post_id,
answer_date,
answer_content,
answer_modified,
answer_published,
answer_ip,
answer_votes,
answer_after,
answer_is_deleted,
votes_answer_item_id,
votes_answer_user_id,
post_id,
post_title,
post_slug,
post_user_id,
post_closed,
post_is_deleted,
id,
login,
avatar
FROM answers
LEFT JOIN users ON id = answer_user_id
LEFT JOIN posts ON answer_post_id = post_id
LEFT JOIN votes_answer ON votes_answer_item_id = answer_id
AND votes_answer_user_id = :uid_vote
WHERE answer_user_id = :user_id AND post_hidden = 0
AND answer_is_deleted = 0 AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0
ORDER BY answer_id DESC LIMIT :start, :limit ";
return DB::run($sql, ['user_id' => $user_id, 'uid_vote' => $uid_vote, 'start' => $start, 'limit' => $limit])->fetchAll();
}
public static function userAnswersCount($user_id)
{
$sql = "SELECT
answer_id
FROM answers
LEFT JOIN posts ON answer_post_id = post_id
WHERE answer_user_id = :user_id AND answer_is_deleted = 0
AND post_is_deleted = 0 AND post_tl = 0 AND post_tl = 0";
return DB::run($sql, ['user_id' => $user_id])->rowCount();
}
// Information on the id of the answer
// Информацию по id ответа
public static function getAnswerId($answer_id)
{
$sql = "SELECT
answer_id,
answer_post_id,
answer_user_id,
answer_date,
answer_modified,
answer_published,
answer_ip,
answer_order,
answer_after,
answer_votes,
answer_content,
answer_lo,
answer_is_deleted
FROM answers
WHERE answer_id = :answer_id";
return DB::run($sql, ['answer_id' => $answer_id])->fetch();
}
/*
* Best answer
*/
// Choice of the best answer
// Выбор лучшего ответа
public static function setBest($post_id, $answer_id, $selected_best_answer)
{
if ($selected_best_answer) {
DB::run("UPDATE answers SET answer_lo = 0 WHERE answer_id = :id", ['id' => $selected_best_answer]);
}
self::setAnswerBest($answer_id);
self::answerPostBest($post_id, $answer_id);
}
// Let's write down the id of the participant who chose the best answer
// Запишем id участника выбравший лучший ответ
public static function setAnswerBest($answer_id)
{
$sql = "UPDATE answers SET answer_lo = :user_id WHERE answer_id = :answer_id";
return DB::run($sql, ['answer_id' => $answer_id, 'user_id' => UserData::getUserId()]);
}
// Rewriting the number of the selected best answer in the post
// Переписываем номер выбранного лучший ответ в посте
public static function answerPostBest($post_id, $answer_id)
{
$sql_two = "UPDATE posts SET post_lo = :answer_id WHERE post_id = :post_id";
return DB::run($sql_two, ['post_id' => $post_id, 'answer_id' => $answer_id]);
}
}