Возможно, что-то простое, но мой построитель запросов не возвращает то, что я хочу. Я хотел бы что-то вроде ... где ... И (.... ИЛИ ....)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;
}
Спасибо за ваши советы
@MkJ: thx для этого. Один вопрос, будет ли этот код возвращаться только для acc = 2 или acc = 5 или для 2,3,4,5? –
@BenjaminLucas это будет работать на столько, сколько у вас есть учетных данных, если у вас 2,3,3,5, то это даст 2,3,4,5, а если у вас 2,5, то за 2,5 –
@ MKJ thx, я думал, что IN был своего рода RANGE. –