2021-12-15 01:27:17 +03:00
< ? php declare ( strict_types = 1 );
namespace openvk\Web\Models\Repositories ;
use openvk\Web\Models\Entities\Topic ;
use openvk\Web\Models\Entities\Club ;
use Nette\Database\Table\ActiveRow ;
use Chandler\Database\DatabaseConnection ;
class Topics
{
private $context ;
private $topics ;
function __construct ()
{
$this -> context = DatabaseConnection :: i () -> getContext ();
$this -> topics = $this -> context -> table ( " topics " );
}
private function toTopic ( ? ActiveRow $ar ) : ? Topic
{
return is_null ( $ar ) ? NULL : new Topic ( $ar );
}
function get ( int $id ) : ? Topic
{
return $this -> toTopic ( $this -> topics -> get ( $id ));
}
function getTopicById ( int $club , int $topic ) : ? Topic
{
return $this -> toTopic ( $this -> topics -> where ([ " group " => $club , " virtual_id " => $topic , " deleted " => 0 ]) -> fetch ());
}
function getClubTopics ( Club $club , int $page = 1 , ? int $perPage = NULL ) : \Traversable
{
$perPage = $perPage ? ? OPENVK_DEFAULT_PER_PAGE ;
2022-05-08 13:06:26 +03:00
# Get pinned topics first
2021-12-15 01:27:17 +03:00
$query = " SELECT `id` FROM `topics` WHERE `pinned` = 1 AND `group` = ? AND `deleted` = 0 UNION SELECT `id` FROM `topics` WHERE `pinned` = 0 AND `group` = ? AND `deleted` = 0 " ;
$query .= " LIMIT " . $perPage . " OFFSET " . ( $page - 1 ) * $perPage ;
foreach ( DatabaseConnection :: i () -> getConnection () -> query ( $query , $club -> getId (), $club -> getId ()) as $topic ) {
$topic = $this -> get ( $topic -> id );
if ( ! $topic ) continue ;
yield $topic ;
}
}
function getClubTopicsCount ( Club $club ) : int
{
return sizeof ( $this -> topics -> where ([
" group " => $club -> getId (),
" deleted " => false
]));
}
function find ( Club $club , string $query ) : \Traversable
{
return new Util\EntityStream ( " Topic " , $this -> topics -> where ( " title LIKE ? AND group = ? AND deleted = 0 " , " % $query % " , $club -> getId ()));
}
function getLastTopics ( Club $club , ? int $count = NULL ) : \Traversable
{
$topics = $this -> topics -> where ([
" group " => $club -> getId (),
" deleted " => false
]) -> page ( 1 , $count ? ? OPENVK_DEFAULT_PER_PAGE ) -> order ( " created DESC " );
foreach ( $topics as $topic )
yield $this -> toTopic ( $topic );
}
}