2014-09-18 3 views
1

Возможно, что-то простое, но мой построитель запросов не возвращает то, что я хочу. Я хотел бы что-то вроде ... где ... И (.... ИЛИ ....)symfony doctrine complex querybuilder

Я пытаюсь прочитать доктрину doc, но я не владею английским языком, поэтому я действительно не понимаю Доктрина Док (возможно, перевод на французском языке доступен?).

<?php 
// $qb instanceof QueryBuilder 

$qb->select(array('u')) // string 'u' is converted to array internally 
    ->from('User', 'u') 
    ->where($qb->expr()->orX(
     $qb->expr()->eq('u.id', '?1'), 
     $qb->expr()->like('u.nickname', '?2') 
    )) 
    ->orderBy('u.surname', 'ASC')); 

Вот мой тестовый код MySQL, который работает

select count(distinct(u.username)) from fos_user u join users_accounts ua ON u.id=ua.user_id join account acc ON acc.id = ua.account_id where u.id=48 and (acc.id=2 OR acc.id=5) 

Вот конструктор запросов:

Я использую услугу, потому что я должен был использовать эту функциональность более чем один раз ,

/** 
* Check if User exists in one of the connected user (Admin or SupAdmin) accounts 
* argument : userID 
* 
*/ 
public function userExists($userID) 
    {  
     // Return accounts (array) 
     $accounts = $this->accountManager->listAccountsByConnectedUser(); 
     $repository = $this->em->getRepository('CMiNewsBundle:User'); 

     $qb = $repository->createQueryBuilder('u'); 

     $query = $qb 
        ->select('count(u)') 
        ->join ('u.accounts', 'acc') 
        ->where('u.id = :userID') 
        ->andwhere('acc.id = :accountID') 
        ->setParameters(array(
         'userID' => $userID, 
         'accountID' => $accounts[0]->getId(), 
        )); 

        if (count($accounts) > 1) { 


        $accountMax = count($accounts);       

        for($acc=1; $acc<$accountMax; $acc++) 
        { 
         $query->orWhere('acc.id = :accountID_'.$acc.'')->setParameter('accountID_'.$acc.'', $accounts[$acc]->getId()); 
        } 
        }; 

        $query = $query->getQuery(); 
        $result = $query->getResult(); 
     return $result; 
    } 

Спасибо за ваши советы

ответ

0

Вы можете переписать запрос, как с помощью IN() в MySQL, как показано ниже

SELECT 
    COUNT(DISTINCT (u.username)) 
FROM 
    fos_user u 
    JOIN users_accounts ua 
    ON u.id = ua.user_id 
    JOIN account acc 
    ON acc.id = ua.account_id 
WHERE u.id = 48 
    AND acc.id IN(2,5) /* this is equivalent to acc.id = 2 or acc.id = 5 */ 

Текущий запрос для научения вы работаете игнорирует ваших, и состояние, как если у вас есть 2 учетных данных, запрос будет

WHERE u.id = 48 AND acc.id = 2 OR acc.id = 5 

Так что дадут записей для acc.id = 5 и u.id могут быть любым другим идентификатором


Для доктрины запроса вы можете переписать код, как показано ниже, Вы должны создать массив учетных записей идентификаторов и передать этот массив в вашем предложении IN()

public function userExists($userID) 
{ 
    // Return accounts (array) 
    $accounts = $this->accountManager->listAccountsByConnectedUser(); 
    $repository = $this->em->getRepository('CMiNewsBundle:User'); 
    $qb = $repository->createQueryBuilder('u'); 
    $accounts=array(); 
    $accounts[]=$accounts[0]->getId(); 
    if (count($accounts) > 1) { 
     $accountMax = count($accounts); 
     for ($acc = 1; $acc < $accountMax; $acc++) { 
      $accounts[]=$accounts[$acc]->getId(); 
     } 
    } 
    $query = $qb 
     ->select('count(u) as your_count') 
     ->join('u.accounts', 'acc') 
     ->where('u.id = :userID') 
     ->andwhere('acc.id IN(:accountID)') 
     ->setParameters(array(
      'userID' => $userID, 
      'accountID' => $accounts, 
     )); 
    $query = $query->getQuery(); 
    $result = $query->getResult(); 
    return $result; 
} 
+0

@MkJ: thx для этого. Один вопрос, будет ли этот код возвращаться только для acc = 2 или acc = 5 или для 2,3,4,5? –

+0

@BenjaminLucas это будет работать на столько, сколько у вас есть учетных данных, если у вас 2,3,3,5, то это даст 2,3,4,5, а если у вас 2,5, то за 2,5 –

+1

@ MKJ thx, я думал, что IN был своего рода RANGE. –

Смежные вопросы