Symfony ile proje geliştirirken default ORM olarak Doctrine kullanıyoruz. Ancak Doctrine’de (native query yazmıyorsanız) random olarak entity çağırmanız mümkün olmuyor. Ancak bunun için ufak bi extension ekleyerek sorunu çözebiliyoruz.
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
class RandFunction extends FunctionNode
{
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(SqlWalker $sqlWalker)
{
return 'RAND()';
}
}
İlk etapta yukarıda ki RandFunction classını oluşturmanız ve bundan sonra config.yml dosyamıza bir ayar çekmemiz gerekiyor.
orm:
dql:
numeric_functions:
Rand: Friend\Bundle\CoreBundle\DQL\RandFunction
Bunu yapmamızın ardından artık RAND() functionu Doctrine ile beraber otomatik olarak yüklü gelecek.
public function getRandomUser($limit)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->addSelect('user');
$qb->addSelect('RAND() as HIDDEN rand')->orderBy('rand');
$qb->from('AcmeUserBundle:User', 'user');
$qb->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
Ardından yukarıda ki örnekte olduğu gibi istediğiniz Entity’den random obje çekebilirsiniz.