2017-02-13 1 views
1

Я использую Symfony 3 и doctrine 2.5. Там три таблицы всего:MySQL и Doctrine QueryBuilder Несколько LEFT и INNER JOINS из трех таблиц

a. user table: 
     id  name 
     1  Alex 
     2  Jim 
     3  Bob 

b. companies table 
     id  name 
     1  company1 
     2  company2 

c. company_users containing the relationship, both user_id and company_id. 
     id  company_id user_id 
     1  1   1 
     2  2   1 
     3  2   2 

Данная компания идентификатор 2, Конечный результат должен быть, но для жизни меня я не могу написать метод работы Доктрина QueryBuilder ибо она

1 company2 - Alex 
2 company2 - Jim 

У меня есть три рабочих MySQL запросов, которые приносят мне желаемый результат. НО для жизни меня я не могу перенести ни одно из них, по крайней мере, в один рабочий запрос Doctrine.

Рабочая MySQL запросов (которые, возможно, будет на самом деле помочь некоторым пользователям здесь):

SELECT companies.name, user.username 
FROM companies 
LEFT JOIN company_users ON company_users.company_id = companies.id 
LEFT JOIN user ON company_users.user_id = user.id WHERE companies.id = 2; 

SELECT u.username, c.name 
FROM user u, company_users cu, companies c 
WHERE cu.user_id = u.id and cu.company_id = c.id and c.id = 2 

SELECT companies.name, user.username 
FROM companies 
LEFT JOIN company_users 
    INNER JOIN user 
    ON company_users.user_id=user.id 
ON company_users.company_id=companies.id WHERE companies.id=2; 

Моя попытка QueryBuilder Доктрины в:

 ->select('u.username', 'c.name') 
     ->from('companies','c') 
     ->leftJoin('c', 'company_users', 'cu', 'company_users.company_id = companies.id') 
     ->leftJoin('u', 'user', 'u', 'company_users.user_id = user.id') 
     ->where('c.id = :companyId') 
     ->setParameter('companyId', $companyId) 
     ->getQuery() 
     ->getResult(); 
+0

Почему вы не используете псевдонимы в условиях соединения? '' company_users.company_id = company.id'' -> '' cu.company_id = c.id'' –

ответ

0

Почему бы вам не использовать псевдонимы в условия соединения? 'company_users.company_id = companies.id' ->'cu.company_id = c.id'.

Синтаксис левого соединения отличается от того, который вы используете.

общественная функция LeftJoin ($ присоединиться, $ псевдоним $ conditionType = нуль, $ условие = NULL, $ indexBy = NULL);

Fixed строитель

->select('u.username', 'c.name') 
    ->from('companies','c') 
    ->leftJoin('company_users', 'c', 'WITH', 'cu.company_id = c.id') 
    ->leftJoin('user', 'u', 'WITH', 'cu.user_id = u.id') 
    ->where('c.id = :companyId') 
    ->setParameter('companyId', $companyId) 
    ->getQuery() 
    ->getResult(); 
0

Правильный ответ, который работал на Symfony 3 и доктрины 2.5 в QueryBuilder.

$query = $this->_em->createQueryBuilder() 
     ->select('u.username', 'c.name', 'c.id') 
     ->from('AppBundle\Entity\User','u') 
     ->leftJoin('AppBundle\Entity\CompanyUsers', 'cu', 'WITH', 'cu.user = u.id') 
     ->leftJoin('AppBundle\Entity\Companies', 'c', 'WITH', 'cu.company = c.id') 
     ->where('u.id = :userId') 
     ->setParameter('userId', $userId) 
     ->getQuery() 
     ->getResult(); 

    $result = []; 
    $result['userName'] = $query[0]['username']; 
    $result['userId'] = $userId; 
    $result['companies'] = []; 

    foreach ($query as $q) { 
     $result['companies'][] = array('companyName' => $q['name'], 'companyId' => $q['id']); 

    } 

    return $result; 
Смежные вопросы