加入多个表,包括2个连接表

时间:2013-04-19 21:41:27

标签: database doctrine-orm

我尝试在一个查询中连接多个表。

My Entitie Relations:

Entities\Person:
  type: entity
  table: person
  manyToOne:
    address:
      targetEntity: Address
      joinColumn:
        name: idaddress
        referencedColumnName: idaddress
  manyToMany:
    tags:
      targetEntity: Tag
      joinTable:
        name: persons_tags
        joinColumns:
          person_idperson:
            referencedColumnName: idperson
        inverseJoinColumns:
          tag_idtag:
            referencedColumnName: idtag

标签

Entities\Tag:
  type: entity
  table: tag
  manyToMany:
    sms:
      targetEntity: Sms
      mappedBy: tag

短信

  manyToMany:
    tag:
      targetEntity: Tag
      joinTable:
        name: sms_tags
        joinColumns:
          sms_idsms:
            referencedColumnName: idsms
        inverseJoinColumns:
          tag_idtag:
            referencedColumnName: idtag

这是一个有效的工作SQL语句:

SELECT DISTINCT person.lastname, person.firstname, address.mobileprivate, address.mobilebusiness FROM
    `address`,
    `person`,
    `persons_tags`,
    `sms_tags`
WHERE
    person.idaddress = address.idaddress
    AND person.idperson = persons_tags.person_idperson
    AND persons_tags.tag_idtag = sms_tags.tag_idtag
    AND sms_tags.sms_idsms = (myINPUT)

现在我尝试在DQL中加入所需的实体以获得相同的结果:

SELECT DISTINCT s, t, p, a 
FROM Entities\Sms s 
JOIN s.sms_idsms t 
JOIN t.person_idperson p 
JOIN p.idaddress a 
WHERE s.idsms = (myINPUT)

但我只得到一个错误:

PHP Fatal error:  Uncaught exception 'Doctrine\\ORM\\Query\\QueryException' with message '
SELECT DISTINCT s, t, p, a 
FROM Entities\\Sms s 
JOIN s.sms_idsms t 
JOIN t.person_idperson p 
JOIN p.idaddress a 
WHERE s.idsms = 2' in 
/var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/QueryException.php:39
Stack trace:
#0 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(429): Doctrine\\ORM\\Query\\QueryException::dqlError('SELECT DISTINCT...')
#1 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(925): Doctrine\\ORM\\Query\\Parser->semanticalError('Class Entities\\...')
#2 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(1561): Doctrine\\ORM\\Query\\Parser->JoinAssociationPathExpression()
#3 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(1506): Doctrine\\ORM\\Query\\Parser->JoinAssociationDeclaration()
#4 /var/www/ci_ in /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/QueryException.php on line 49

如何编写像工作SQL查询一样的DQL查询?

我尝试避免使用本机SQL查询

以下是查询构建器的尝试:

    $qb->select(array('s', 't', 'p', 'a'))
       ->from('Entities\Sms', 's')
       ->leftJoin('s.tag', 't')
       ->leftJoin('t.person', 'p')
       ->leftJoin('p.address', 'a')
       ->where('s.idsms = 1');

错误信息

PHP Fatal error:  Uncaught exception 'Doctrine\\ORM\\Query\\QueryException' with message 'SELECT s, t, p, a FROM Entities\\Sms s LEFT JOIN s.tag t LEFT JOIN t.person p LEFT JOIN p.address a WHERE s.idsms = 1' in /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/QueryException.php:39\nStack trace:\n#0 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(429): Doctrine\\ORM\\Query\\QueryException::dqlError('SELECT s, t, p,...')\n#1 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(925): Doctrine\\ORM\\Query\\Parser->semanticalError('Class Entities\\...')\n#2 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(1561): Doctrine\\ORM\\Query\\Parser->JoinAssociationPathExpression()\n#3 /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/Parser.php(1506): Doctrine\\ORM\\Query\\Parser->JoinAssociationDeclaration()\n#4 /var/www/ci_doc_rem/Cod in /var/www/ci_doc_rem/Codeigniter_Doctrine/source/application/libraries/Doctrine/ORM/Query/QueryException.php on line 49

1 个答案:

答案 0 :(得分:0)

解决方案很容易找到。

我已经为每个表/权限替换了'id'的idname命名约定,并仔细查看了Picking Owning和Inverse Side。

http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#picking-owning-and-inverse-side

这使我能够写出正确的关系。

对我来说,一个很大的问题是解码调试堆栈跟踪以找到我的错误。

感谢任何花时间解决我的问题的人!