有多个字段时如何与 Doctrine 一起使用 OR 函数?
How to use with Doctrine the OR function when having multiple fields?
我正在制作一个登录表单,用户可以在其中决定使用此用户名或电子邮件地址及其密码。所以通常它会是这样的:SQL 中的((用户名或电子邮件)和密码)。用了下面的controller代码只是不知道怎么加OR函数
$user = $this->getDoctrine()
->getRepository('Bundle:CusUser')
->findOneBy(
array('username' => $user->getUsername(), 'email' => $user->getUsername(), 'password' => $user->getPassword())
);
两者都使用了 getUsername,因为这是表单中的内容。
实际上默认学说中没有->orBy(...)
方法EntityRepository
。
您可以在 class.
的 API 中找到所有可用的方法
而是使用 QueryBuilder
:
$query = $this->getDoctrine()
->getRepository('Bundle:CusUser')
->createQueryBuilder('u')
->select('u')
->where('u.username = :username')
->orWhere('u.email = :email')
->setParameter('username', $user->getUsername())
->setParameter('email', $user->getEmail())
->getQuery();
// Get the first result
$user = $query->setMaxResults(1)->getSingleResult();
将其放入自定义 EntityRepository
中,并将其与用作 where
和 orWhere
语句参数的参数数组一起使用。例如:
public function findByOrBy(array $parameters)
{
$query = $this->getEntityManager()->createQueryBuilder();
// ...
foreach ($parameters as $property => $value) {
$query
->orWhere($property.' = :'.$property)
->setParameter($property, $value)
// ...
}
}
您可以在QueryBuilder
API.
中找到可用方法的列表(几乎所有对应原生SQL方法)
FOSUserBundle 具有类似的功能,允许用户使用电子邮件或用户名登录。
他们只是检查用户输入是否是电子邮件:
来自第 102 行的 friendsofsymfony/user-bundle/Model/UserManager.php
/**
* Finds a user either by email, or username
*
* @param string $usernameOrEmail
*
* @return UserInterface
*/
public function findUserByUsernameOrEmail($usernameOrEmail)
{
if (filter_var($usernameOrEmail, FILTER_VALIDATE_EMAIL)) {
return $this->findUserByEmail($usernameOrEmail);
}
return $this->findUserByUsername($usernameOrEmail);
}
所以在你的控制器中你可以有这个:
public function loginAction()
{
//...
if (filter_var($usernameOrEmail, FILTER_VALIDATE_EMAIL)) {
$user = $this->get('doctrine')
->getRepository('Bundle:CusUser')
->findOneBy(array('email' => $usernameOrEmail, 'password' => $password));
}
else {
$user = $this->get('doctrine')
->getRepository('Bundle:CusUser')
->findOneBy(array('username' => $usernameOrEmail, 'password' => $password));
}
//...
}
希望对您有所帮助
我正在制作一个登录表单,用户可以在其中决定使用此用户名或电子邮件地址及其密码。所以通常它会是这样的:SQL 中的((用户名或电子邮件)和密码)。用了下面的controller代码只是不知道怎么加OR函数
$user = $this->getDoctrine()
->getRepository('Bundle:CusUser')
->findOneBy(
array('username' => $user->getUsername(), 'email' => $user->getUsername(), 'password' => $user->getPassword())
);
两者都使用了 getUsername,因为这是表单中的内容。
实际上默认学说中没有->orBy(...)
方法EntityRepository
。
您可以在 class.
而是使用 QueryBuilder
:
$query = $this->getDoctrine()
->getRepository('Bundle:CusUser')
->createQueryBuilder('u')
->select('u')
->where('u.username = :username')
->orWhere('u.email = :email')
->setParameter('username', $user->getUsername())
->setParameter('email', $user->getEmail())
->getQuery();
// Get the first result
$user = $query->setMaxResults(1)->getSingleResult();
将其放入自定义 EntityRepository
中,并将其与用作 where
和 orWhere
语句参数的参数数组一起使用。例如:
public function findByOrBy(array $parameters)
{
$query = $this->getEntityManager()->createQueryBuilder();
// ...
foreach ($parameters as $property => $value) {
$query
->orWhere($property.' = :'.$property)
->setParameter($property, $value)
// ...
}
}
您可以在QueryBuilder
API.
FOSUserBundle 具有类似的功能,允许用户使用电子邮件或用户名登录。
他们只是检查用户输入是否是电子邮件:
来自第 102 行的 friendsofsymfony/user-bundle/Model/UserManager.php
/**
* Finds a user either by email, or username
*
* @param string $usernameOrEmail
*
* @return UserInterface
*/
public function findUserByUsernameOrEmail($usernameOrEmail)
{
if (filter_var($usernameOrEmail, FILTER_VALIDATE_EMAIL)) {
return $this->findUserByEmail($usernameOrEmail);
}
return $this->findUserByUsername($usernameOrEmail);
}
所以在你的控制器中你可以有这个:
public function loginAction()
{
//...
if (filter_var($usernameOrEmail, FILTER_VALIDATE_EMAIL)) {
$user = $this->get('doctrine')
->getRepository('Bundle:CusUser')
->findOneBy(array('email' => $usernameOrEmail, 'password' => $password));
}
else {
$user = $this->get('doctrine')
->getRepository('Bundle:CusUser')
->findOneBy(array('username' => $usernameOrEmail, 'password' => $password));
}
//...
}
希望对您有所帮助