2017-02-13 14 views
1

私はSymfony 3とdoctrine 2.5を使用しています。 3つのテーブルは、合計あります:MySQLとDoctrine QueryBuilder 3つのテーブルから複数の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 

は企業ID 2を考えると、最終的な結果は、このする必要がありますが、私の人生のために私はそれ

1 company2 - Alex 
2 company2 - Jim 

の作業ドクトリンQueryBuilderメソッドを記述することはできません私は3つの作業を持っています私の望む結果をもたらすMySQLのクエリ。 私の人生のために、私はそれを少なくとも1つの動作する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; 

Doctrineの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); symfonyの3と教義2.5のqueryBuilderのために働い

固定ビルダー

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

適切な答え。

$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; 
関連する問題