到目前为止,我有两个类似的查询:
用户为ROLE_REDAC时使用的第一个
$qb = $this->createQueryBuilder('a');
$qb->LeftJoin('a.ArticlePhrases','ap')
->addSelect('ap')
->where(
$qb->expr()->andX(
$qb->expr()->eq('ap.order', '?1'),
$qb->expr()->eq('a.author', '?2')
)
)
->setParameters(//...
);
用户为ROLE_ADMIN时的第二个
$qb = $this->createQueryBuilder('a');
$qb->LeftJoin('a.ArticlePhrases','ap')
->addSelect('ap')
->where(
$qb->expr()->andX(
$qb->expr()->eq('ap.order', '?1')
)
)
->setParameters(...
));
没有太大区别。是否可以从控制器调用相同的存储库功能,并且该功能适应实际用户是否为ROLE_REDAC或ROLE_ADM?如果是的话我该怎么做?
答案 0 :(得分:2)
我还没有对它进行过测试,但是应该可以使用
class MyCustomRepository extends EntityRepository
{
public function myCustomFunction($user_role)
{
$qb = $this->createQueryBuilder('a');
if ($user_role == 'ROLE_REDAC') {
$where_dql_expr = $qb->expr()->andX(
$qb->expr()->eq('ap.order', '?1'),
$qb->expr()->eq('a.author', '?2')
);
$qb->setParameters(//....);
}
else if ($user_role == 'ROLE_ADMIN') {
$where_dql_expr = $qb->expr()->andX(
$qb->expr()->eq('ap.order', '?1')
);
$qb->setParameters(//....);
}
$qb->LeftJoin('a.ArticlePhrases','ap')
->addSelect('ap')
->where($where_dql_expr)
->//and so on
}
}
当然进入你的控制器你必须通过正确的参数调用它
$role = //retrieve role
$custom_repo = $this->getDoctrine()
->getManager()
->getRepository('YourBundleName:MyCustomEntity');
$custom_repo->myCustomFunction($role);