使用like子句在FOSUserbundle中搜索用户

时间:2014-07-12 11:37:15

标签: symfony doctrine-orm fosuserbundle

我正在使用FOSUserundle,我使用此代码来查找用户:

$userManager = $this->get('fos_user.user_manager');
    $user = $userManager->findUserBy(array(
        'username'  =>  'name surname',
    ));

它的关键是与用户名完全匹配,有没有办法使用'like子句'?

感谢

我的解决方案

use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository
{
public function findUserByUsernameLike($username)
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT u.id, u.username FROM MyUserBundle:User u where u.username LIKE :username ORDER BY u.username ASC'
        )
        ->setParameter('username', '%'.$username.'%')
        ->getResult();

}

}

1 个答案:

答案 0 :(得分:0)

UserManager::findUserBy()方法只是Doctrine EntityManager::findOneBy()的代理,它不支持LIKE表达式。您必须创建一个自定义DQL查询,如下所示:

SELECT u FROM MyBundle:User u WHERE u.username LIKE :username

您可以创建自己的UserManager课程,该课程将扩展由FOSUserBundle提供的UserManager

use FOS\UserBundle\Doctrine\UserManager as BaseManager;

class UserManager extends BaseManager
{
    public function findUserByUsernameLike($username)
    {
       return $this->repository->createQueryBuilder('u')
           ->where('u.username LIKE :username')
           ->setParameter('username', '%' . $username . '%')
           ->getQuery()
           ->getSingleResult();
    }
}

将其注册为源自fos_user.user_manager的服务:

<service id="my.user_manager" class="...\UserManager" parent="fos_user.user_manager" />

告诉FOSUserBundle将此类用作用户管理器:

# config.yaml

fos_user:
    services:
        user_manager: my.user_manager
相关问题