forkbb/app/Models/Topic/Load.php
2020-10-14 21:46:49 +07:00

113 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace ForkBB\Models\Topic;
use ForkBB\Models\Action;
use ForkBB\Models\Forum\Model as Forum;
use ForkBB\Models\Topic\Model as Topic;
use InvalidArgumentException;
class Load extends Action
{
/**
* Создает текст запрос
*/
protected function getSql(string $where, bool $full): string
{
if ($this->c->user->isGuest) {
$query = 'SELECT t.*
FROM ::topics AS t
WHERE ' . $where;
} elseif ($full) {
$query = 'SELECT t.*, s.user_id AS is_subscribed, mof.mf_mark_all_read, mot.mt_last_visit, mot.mt_last_read
FROM ::topics AS t
LEFT JOIN ::topic_subscriptions AS s ON (t.id=s.topic_id AND s.user_id=?i:uid)
LEFT JOIN ::mark_of_forum AS mof ON (mof.uid=?i:uid AND t.forum_id=mof.fid)
LEFT JOIN ::mark_of_topic AS mot ON (mot.uid=?i:uid AND t.id=mot.tid)
WHERE ' . $where;
} else {
$query = 'SELECT t.*, mot.mt_last_visit, mot.mt_last_read
FROM ::topics AS t
LEFT JOIN ::mark_of_topic AS mot ON (mot.uid=?i:uid AND t.id=mot.tid)
WHERE ' . $where;
}
return $query;
}
/**
* Загружает тему из БД
*/
public function load(int $id): ?Topic
{
if ($id < 1) {
throw new InvalidArgumentException('Expected a positive topic id');
}
$vars = [
':tid' => $id,
':uid' => $this->c->user->id,
];
$query = $this->getSql('t.id=?i:tid', true);
$data = $this->c->DB->query($query, $vars)->fetch();
// тема отсутствует или недоступна
if (empty($data)) {
return null;
}
$topic = $this->manager->create($data);
$forum = $topic->parent;
if ($forum instanceof Forum) {
$forum->__mf_mark_all_read = $topic->mf_mark_all_read;
return $topic;
} else {
return null;
}
}
/**
* Загружает список тем из БД
*/
public function loadByIds(array $ids, bool $full): array
{
foreach ($ids as $id) {
if (
! \is_int($id)
|| $id < 1
) {
throw new InvalidArgumentException('Expected a positive topic id');
}
}
$vars = [
':ids' => $ids,
':uid' => $this->c->user->id,
];
$query = $this->getSql('t.id IN (?ai:ids)', $full);
$stmt = $this->c->DB->query($query, $vars);
$result = [];
while ($row = $stmt->fetch()) {
$topic = $this->manager->create($row);
if ($topic->parent instanceof Forum) {
$result[] = $topic;
if (! empty($row['mf_mark_all_read'])) {
$topic->parent->__mf_mark_all_read = $row['mf_mark_all_read'];
}
}
}
return $result;
}
}