Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Doctrine和postgreSQL获得左连接的第一个结果_Php_Postgresql_Doctrine Orm - Fatal编程技术网

Php 如何使用Doctrine和postgreSQL获得左连接的第一个结果

Php 如何使用Doctrine和postgreSQL获得左连接的第一个结果,php,postgresql,doctrine-orm,Php,Postgresql,Doctrine Orm,在一个使用条令2和postgreSQL数据库的项目中,我在实体妇科医生和他的电子邮件和电话号码之间有一个简单的一对多关系。我想查询数据库,为每个人获得一行第一次插入的电子邮件和号码。 我预期的结果如下: ------------------- SURNAME | NAME | EMAIL | TEL. NR.| Surname1 | Name1 | email1@gmail.it | number1 | ------------------- 我试过: $columns

在一个使用条令2和postgreSQL数据库的项目中,我在实体妇科医生和他的电子邮件和电话号码之间有一个简单的一对多关系。我想查询数据库,为每个人获得一行第一次插入的电子邮件和号码。 我预期的结果如下:

-------------------
SURNAME  | NAME  | EMAIL           | TEL. NR.|
Surname1 | Name1 | email1@gmail.it | number1 |
-------------------
我试过:

$columns = array('g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC')
    ->groupBy('g.id')
    ->addGroupBy('g.companyName')
    ->addGroupBy('g.surname')
    ->addGroupBy('g.name')
    ->addGroupBy('e.email')
    ->addGroupBy('t.number');
这是生成的查询:

SELECT g0_.id AS id_0, g0_.company_name AS company_name_1, g0_.surname AS surname_2, g0_.name AS name_3, g1_.email AS email_4, g2_.number AS number_5 
FROM gynecologists 
g0_ INNER JOIN gynecologists_emails g1_ ON g0_.id = g1_.gynecologist_id 
INNER JOIN gynecologists_telephone_numbers g2_ ON g0_.id = g2_.gynecologist_id
GROUP BY g0_.id, g0_.company_name, g0_.surname, g0_.name, g1_.email, g2_.number 
ORDER BY g0_.surname ASC, g0_.name ASC 
LIMIT 500 OFFSET 0
根据StackOverflow用户的建议,我还尝试:

$columns = array('DISTINCT g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC');

SELECT DISTINCT g0_.id AS id_0, g0_.company_name AS company_name_1, g0_.surname AS surname_2, g0_.name AS name_3, g1_.email AS email_4, g2_.number AS number_5 
FROM gynecologists g0_ 
INNER JOIN gynecologists_emails g1_ ON g0_.id = g1_.gynecologist_id 
INNER JOIN gynecologists_telephone_numbers g2_ ON g0_.id = g2_.gynecologist_id
ORDER BY g0_.surname ASC, g0_.name ASC 
LIMIT 500 OFFSET 0
但结果总是:

-------------------
SURNAME  | NAME  | EMAIL           | TEL. NR.|
Surname1 | Name1 | email1@gmail.it | number1 |
Surname1 | Name1 | email1@gmail.it | number2 |
Surname1 | Name1 | email2@gmail.it | number1 |
Surname1 | Name1 | emai21@gmail.it | number2 |
-------------------

谢谢。

我认为它应该适合您:

$columns = array('DISTINCT g.id', 'g.companyName', 'g.surname', 'g.name', 'e.email', 't.number');

$queryBuilder = $this->getDoctrine()
    ->getRepository('AppBundle:Gynecologist')
    ->createQueryBuilder('g')
    ->select($columns)
    ->join('g.emails', 'e')
    ->join('g.telephoneNumbers', 't')
    ->orderBy('g.surname', 'ASC')
    ->addOrderBy('g.name', 'ASC');

使用group by时,所有选定的列必须位于group by列中,或与聚合函数一起使用,如max()、avg()…Ok。但是如何修复查询,使每个人只返回一行?按所选列分组我得到了与保存的电子邮件或电话号码相同的每人行数…您可以添加生成的查询吗?完成,我编辑了帖子。如何确定第一次插入的电子邮件和电话号码?有什么规定吗?它不起作用。我根据你的建议编辑了我的信息。非常感谢。