{"id":179,"date":"2017-10-06T04:44:45","date_gmt":"2017-10-06T07:44:45","guid":{"rendered":"http:\/\/hackerzone.com.br\/blog\/?p=179"},"modified":"2022-08-13T00:20:29","modified_gmt":"2022-08-13T03:20:29","slug":"zend-framework-3-doctrine-createquerybuilder-not-in-and-relationship","status":"publish","type":"post","link":"http:\/\/hackerzone.com.br\/blog\/zend-framework-3-doctrine-createquerybuilder-not-in-and-relationship\/","title":{"rendered":"Zend Framework 3 + Doctrine &#8211; CreateQueryBuilder not in and Relationship"},"content":{"rendered":"<p>Surgiu a necessidade de criar uma consulta na qual relacionava duas tabelas, pois precisaria das informa\u00e7\u00f5es contidas nas duas, mas eu gostaria de buscar apenas os registros aos quais n\u00e3o houvessem rela\u00e7\u00e3o, no caso a tabela que recebe a chave estrangeira n\u00e3o poderia conter o identificador da minha tabela prim\u00e1ria, foi ent\u00e3o que resolvi da seguinte forma:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$rastreador = $em-&gt;createQueryBuilder('a');\r\n$rastreadores = $rastreador-&gt;select(array('r', 'rm'))\r\n                -&gt;from(\\MODRastreador\\Entity\\Rastreador::class, 'r')\r\n                -&gt;leftJoin(\\MODRastreamento\\Entity\\Rastreamento::class, 'rm', Expr\\Join::WITH, 'r.id = rm.idRastreador') \/\/AND rm.dataTransferencia IS NOT NULL\r\n                -&gt;where('r.ativo = ?1')\r\n                -&gt;andWhere('r.idEmpresa = ?2')               \r\n                -&gt;andWhere($rastreador-&gt;expr()-&gt;notIn('r.id', $qr_sub-&gt;select('DISTINCT(srm.idRastreador)')\r\n                                -&gt;from(\\MODRastreamento\\Entity\\Rastreamento::class, 'srm')\r\n                                -&gt;where('srm.idEmpresa = ?3')\r\n                                -&gt;getDQL()\r\n                ))\r\n                -&gt;orderBy('r.imei', 'ASC')\r\n                -&gt;setParameter(1, true)\r\n                -&gt;setParameter(2, $this-&gt;getIdentityUser()-&gt;getId())\r\n                -&gt;setParameter(3, $this-&gt;getIdentityUser()-&gt;getId())\r\n                -&gt;getQuery()\r\n                -&gt;getScalarResult();\r\n<\/pre>\n<p>Observe o uso do DISTINCT, se voc\u00ea n\u00e3o utilizar n\u00e3o ser\u00e1 poss\u00edvel retornar apenas a chave estrangeira idRastreador, o \u00fanico campo que aceita retorno \u00fanico \u00e9 o id, mas como quero apenas os ids de nossa chave estrangeira precisamos utilizar o DISTINCT.<br \/>\nPara entender melhor em uma consulta SQL ficaria da seguinte forma:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect idRastreador from rastreamento\r\n<\/pre>\n<p>Tamb\u00e9m dou a dica de tomar cuidado com o where que utilizar na primeira consulta, j\u00e1 que vai fazer uma subconsulta procure realizar os where&#8217;s referentes a segunda tabela dentro da subconsulta.<\/p>\n<p>O comando <strong>getScalarResult()<\/strong> \u00e9 apenas para voltar os resultados em forma de array associativo com o \u00edndice das tabelas que eu defini, n\u00e3o tem rela\u00e7\u00e3o alguma com as opera\u00e7\u00f5es de relacionamento em de subconsultas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Surgiu a necessidade de criar uma consulta na qual relacionava duas tabelas, pois precisaria das informa\u00e7\u00f5es contidas nas duas, mas eu gostaria de buscar apenas os registros aos quais n\u00e3o houvessem rela\u00e7\u00e3o, no caso a tabela que recebe a chave estrangeira n\u00e3o poderia conter o identificador da minha tabela prim\u00e1ria, foi ent\u00e3o que resolvi da [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,12,13],"tags":[84,16,83,85,82,18,19],"class_list":["post-179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-doctrine","category-php","category-zend-framework-3","tag-createquerybuilder","tag-doctrine","tag-not-in","tag-relationship","tag-sql","tag-zend-framework-3","tag-zf3","cat-14-id","cat-12-id","cat-13-id","has_thumb"],"_links":{"self":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/comments?post=179"}],"version-history":[{"count":4,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/179\/revisions"}],"predecessor-version":[{"id":183,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/posts\/179\/revisions\/183"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/media\/459"}],"wp:attachment":[{"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/media?parent=179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/categories?post=179"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/hackerzone.com.br\/blog\/wp-json\/wp\/v2\/tags?post=179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}