如何在具有多个字段时使用Doctrine OR函数?

时间:2016-02-23 20:31:18

标签: symfony doctrine-orm doctrine doctrine-query

我正在制作一个inlog表单,用户可以决定将此用户名或电子邮件地址与其密码结合使用。所以通常它会像SQL中的((用户名或电子邮件)和密码)。使用以下控制器代码只知道如何添加OR函数。

ls *.mp3 | xargs -n 1 -I {} ffmpeg -i {} -c:a libfaac -vn $(basename {} .mp3).m4a

两者都是使用的getUsername,因为这是表格中的闪烁。

2 个答案:

答案 0 :(得分:1)

实际上默认原则->orBy(...)中没有EntityRepository方法 您可以在此课程的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方法的对应关系)。

答案 1 :(得分:0)

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

    //...

}

希望这有帮助