有多个字段时如何与 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 中,并将其与用作 whereorWhere 语句参数的参数数组一起使用。例如:

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));
    }

    //...

}

希望对您有所帮助