2015-11-17 2 views
0
$qb = $em->createQueryBuilder(); 

$qb->select('u') 
    ->from('AppBundle:User','u') 
    ->join('AppBundle:Profile', 'p') 
    ->add(
     'where', 
     $qb->expr() 
      ->between(
       'p.rank', 
       ':min', 
       ':max' 
     ) 
    ) 
    ->andWhere('u.id != :id') 
    ->setParameters(array('min' => $minimumRank, 'max' => $maximumRank, 'id' => $user->getId())); 

    $query = $qb->getQuery(); 
    $players = $query->getResult(); 

Проблема с моим запросом заключается в том, что мой результат всегда возвращает каждую запись из базы данных. Я попытался придумать другое решение, но безрезультатно. Я ищу некоторые предложения. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.doctrine beetwen expr не работает для меня

User.php /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=25, unique=true) * * @Assert\NotBlank( * message = "Nie podałeś nazwy użytkownika" *) * @Assert\Length( * min = 3, * minMessage = "Twoja nazwa użytkownika powinna składać się z minimum {{ limit }} znaków", *) */ protected $username; /** * @ORM\Column(type="string", length=64) * @Assert\NotBlank( * message = "Nie podałeś hasła" *) * @Assert\Length( * min = 6, * minMessage = "Twoje hasło powinno składać się z minimum {{ limit }} znaków", *) */ protected $password; /** * @ORM\Column(type="string", length=60, unique=true) * @Assert\NotBlank( * message = "Nie podałeś adresu e-mail" *) * @Assert\Email( * message = "Wprowadzony adres-email jest nieprawidłowy" *) */ protected $email; /** * @ORM\Column(name="enabled", type="boolean") */ protected $enabled; /** * @ORM\Column(type="string", length=64) */ protected $confirmationToken; /** * @ORM\Column(type="integer") */ protected $time; /** * @ORM\Column(type="datetime", nullable=true) */ protected $lastLogin; /** * @ORM\Column(type="boolean") */ protected $locked; /** * @ORM\Column(type="boolean") */ protected $expired; protected $expiresAt; protected $credentialsExpired; protected $credentialsExpireAt; /** * @ORM\Column(type="boolean") */ protected $firstLogin; /** * @ORM\Column(type="datetime", nullable=true) */ protected $passwordRequestedAt; /** * @ORM\OneToOne(targetEntity="Profile", orphanRemoval=true, inversedBy="user") */ protected $profile;

profile.php /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="steamID", type="string", length=255, nullable=true) */ private $steamID; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $name; /** * @var string * * @ORM\Column(name="surname", type="string", length=255, nullable=true) */ private $surname; /** * @var string * * @ORM\Column(name="rank", type="integer", nullable=true) */ private $rank; /** *@ORM\OneToOne(targetEntity="User", mappedBy="profile") */ private $user;

+1

Принимали ли вы посмотрите на то, как запрос компилируется в SQL ('$ qb-> GetQuery() -> getSql()') или DQL ('$ qb-> getDql()')? Что я делаю, это то, что вы ожидаете. Если они выглядят корректно, проверьте, какие значения вы передаете как параметры. – prodigitalson

+0

'string 'SELECT a0_.id AS id0, a0_.username AS username1, a0_.password AS password2, a0_.email AS email3, a0_.enabled AS enabled4, a0_.confirmation_token AS confirm_token5, a0_.time AS time6, a0_.last_login AS last_login7, a0_.locked AS locked8, a0_.expired AS expired9, a0_.first_login AS first_login10, a0_.password_requested_at AS password_requested_at11, a0_.profile_id AS profile_id12 FROM app_users a0_ INNER JOIN app_profiles a1_ ON ((a1_.rank МЕЖДУ? И?) AND a0_.id <>?) '(Length = 480) ' – nix9

+0

значения не передаются в – nix9

ответ

0

Try этим способом:

$qb = $em->createQueryBuilder() 
    ->select('u') 
    ->from('AppBundle:User','u') 
    ->leftJoin('u.profile', 'p') 
    ->where('u.id != :id') 
    ->andWhere('p.rank > :min') 
    ->andWhere('p.rank < :max') 
    ->setParameters([ 
     'min' => $minimumRank, 
     'max' => $maximumRank, 
     'id' => $user->getId() 
    ]) 
    ->getQuery(); 

$players = $qb->getResult(); 

Надеется, что это поможет вам

+0

это не сработало для меня, получилось такой же результат – nix9

+0

Пробовал ли вы с левым? Я редактирую свой пост в этом направлении. – scoolnico

+0

попробовал, не работал ... – nix9

0

Похожи, что проблема заключается в присоединитесь к себе .. он имеет ваши WHERE условия в ON и без a0_.id = a1_.user_id (или независимо от вашей колонки соединения).

Я мог бы поклясться, что форма QB, созданная EntityManager, сделала какое-то волшебство, и вы поняли условие соединения для вас, но, похоже, это не так, и поскольку вы не указали, что оно перекатывает ваши условия. следующее:

$qb->select('u') 
    ->from('AppBundle:User', u) 
    // changed to use the entity's property on User 
    ->join('u.profile', 'p') 
    ->where($qb->expr()->between(
     'p.rank', 
     ':min', 
     ':max' 
    )) 
    ->andWhere('u.id != :id') 
    ->setParameters(array('min' => $minimumRank, 'max' => $maximumRank, 'id' => $user->getId())); 
+0

'-> join ('AppBundle: Profile', 'p', 'ON', 'u.id = p. user_id ') ' Ошибка: Ожидаемая доктрина \ ORM \ Query \ Lexer :: T_WITH, полученная' ON ' – nix9

+0

Хммм, что странно ... попробуйте константу' \ Doctrine \ ORM \ QueryExpr \ Join :: ON', если это дает вам в той же проблеме попробуйте использовать '' WITH''. – prodigitalson

+0

namespace '\ Doctrine \ ORM \ QueryExpr \ Join :: ON' не существует – nix9