<?php
namespace App\Entity\Repository;
use App\Entity\Forum;
use App\Entity\ForumAccess;
use App\Entity\User;
use Doctrine\ORM\Cache;
use Doctrine\ORM\EntityRepository;
/**
* @method ForumAccess|null find($id, $lockMode = null, $lockVersion = null)
* @method ForumAccess|null findOneBy(array $criteria, array $orderBy = null)
* @method ForumAccess[] findAll()
* @method ForumAccess[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ForumAccessRepository extends EntityRepository
{
/**
* @param Forum $forum
* @return ForumAccess[]
*/
public function getModList(Forum $forum)
{
$queryBuilder = $this->createQueryBuilder('fa')
->select('fa')
->addSelect('partial user.{id, name}')
->addSelect('partial user_data.{id, avatarName}')
->leftJoin('fa.user', 'user')
->leftJoin('user.userData', 'user_data')
->andWhere('fa.user IS NOT NULL')
->andWhere('fa.forum = :forum')
->setParameter('forum', $forum)
->andWhere('fa.modMessage = 1')
->setCacheable(true)
->setCacheMode(Cache::MODE_GET);
return $queryBuilder->getQuery()->getResult();
}
/**
* @param Forum $forum
* @return ForumAccess[]
*/
public function getByForum(Forum $forum): ?ForumAccess
{
$queryBuilder = $this->createQueryBuilder('fa')
->select('fa')
->andWhere('fa.forum = :forum')
->setParameter('forum', $forum)
->setMaxResults(1);
return $queryBuilder->getQuery()->getOneOrNullResult();
}
/**
* @param User $user
* @return ForumAccess[]
*/
public function getByUser(User $user): array
{
$queryBuilder = $this->createQueryBuilder('fa')
->select('fa')
->leftJoin('fa.forum', 'f')
->andWhere('fa.user = :user')
->setParameter('user', $user);
$data = $queryBuilder->getQuery()->getResult();
return array_combine(array_map(function(ForumAccess $fa) {
return $fa->getForum()->getId();
}, $data), $data);
}
/**
* @param User $user
* @return Forum[]
*/
public function getForumWithReadAccessForUser(User $user): array
{
$queryBuilder = $this->createQueryBuilder('fa')
->select('fa')
->leftJoin('fa.forum', 'f')
->where('fa.readMessage = 1')
->andWhere('fa.user = :user OR (fa.user IS NULL AND fa.group IS NULL)')
->andWhere('f.type = 1')
->setParameter('user', $user)
->orderBy('fa.user', 'DESC');
$data = $queryBuilder->getQuery()->getResult();
$access = [];
/** @var ForumAccess $forumAccess */
foreach ($data as $forumAccess) {
if (!isset($access[$forumAccess->getForum()->getId()])) {
$access[$forumAccess->getForum()->getId()] = $forumAccess->getForum();
}
}
return $access;
}
}