2017-02-13 131 views
1

我正在使用Symfony 3和学说2.5。还有的三个表总计:MySQL和Doctrine QueryBuilder从三个表中多个LEFT和INNER JOIN

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 

鉴于公司ID 2,最终的结果应该是这样,但对我的生活,我不能为它编写

1 company2 - Alex 
2 company2 - Jim 

工作学说QueryBuilder的方法,我有三个工作MySQL查询为我带来了期望的结果。 但是对于我的生活,我不能将它转换成至少一个工作原则查询。

工作的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 = companies.id'' - >''cu.company_id = c.id'' –

回答

0

你为什么不使用别名,在加盟条件是什么? 'company_users.company_id = companies.id' - >'cu.company_id = c.id'

左连接语法不同于您使用的语法。

public function leftJoin($ join,$ alias,$ conditionType = null, $ condition = null,$ indexBy = null);

固定建设者

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