Join 条令关联映射联接未在ZF3中执行

Join 条令关联映射联接未在ZF3中执行,join,zend-framework,doctrine-orm,doctrine,zend-framework3,Join,Zend Framework,Doctrine Orm,Doctrine,Zend Framework3,我正在为联接创建第一个关联映射。这也是我第一次在pgSQL中使用外键 我与ZF3合作。我收到的错误是: An exception occurred while executing 'SELECT p0_.reference AS reference_0, p0_.meta_keyword_reference AS meta_keyword_reference_1, p0_.add_date AS add_date_2, p0_.add_membership_reference AS add_me

我正在为联接创建第一个关联映射。这也是我第一次在pgSQL中使用外键

我与ZF3合作。我收到的错误是:

An exception occurred while executing 'SELECT p0_.reference AS reference_0, p0_.meta_keyword_reference AS meta_keyword_reference_1, p0_.add_date AS add_date_2, p0_.add_membership_reference AS add_membership_reference_3, p0_.remove_date AS remove_date_4, p0_.remove_membership_reference AS remove_membership_reference_5 FROM page_about_meta_keyword_link p0_ INNER JOIN meta_keyword m1_':
SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at end of input LINE 1: ...page_about_meta_keyword_link p0_ INNER JOIN meta_keyword m1_
我试图创建的查询是

SELECT MetaKeywords.Keyword FROM PageAboutMetaKeywordLink INNER JOIN MetaKeywords ON PageAboutMetaKeywordLink.MetaKeywordReference = MetaKeywords.Reference WHERE PageAboutMetaKeywordLink.RemoveDate IS NULL ORDER BY MetaKeywords.Keyword ASC
根据我的数据库经验,我认为它是由于缺少

ON p0_.meta_keyword_reference = m1_reference
我不明白如何沟通加入。根据我的预期,这是自动的。也许我误解了

我尝试加入的表是page\u about\u meta\u keyword\u link.meta\u keyword\u reference ON meta\u keyword.reference。这是我第一次在pgSQL中创建外键

这是页面\关于\元\关键字\链接的表结构

这是meta_关键字

这是我在服务中创建的查询;找到完整的服务

我创建的关联映射用于meta_关键字_引用;找到完整的实体

我没有对MetaKeywords实体进行任何更改。它被发现了

总的来说,网站的各个部分将共享meta_关键字。如果我理解正确,我试图建立的联系是多方面的


我想给其他新手留下一个很好的参考,因为他们正在经历Zend Framework 3-Doctrine的旅程。请告知我应该对这篇文章进行哪些编辑,使其清晰、易懂和简洁,以便我得到所需的帮助,其他人将来也会从中受益。

你双重声明了一个专栏元关键字参考。查看您所链接的同一页,您的注释出现了错误。删除定义已在JoinColumn中的ORM\列行。如果需要将其设置为nullable(非必需),请将nullable=true添加到JoinColumn;要么使用,不要同时使用

/**
 * @var int|null
 *
 * @ORM\ManyToOne(targetEntity="MetaKeyword")
 * @ORM\JoinColumn(name="meta_keyword_id", referencedColumnName="id", nullable=true)
 */
private $metaKeywordReference;
不要担心声明类型,它会自动将它与您引用的列相匹配。此外,还应该引用主键。我假设reference不是PK,所以我把它改成id,改成它实际上是什么

接下来,我认为您也在使用DBAL QueryBuilder而不是ORM QueryBuilder

您需要的查询如下所示:

use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;

/** @var QueryBuilder $qb */
$qb = $this->entityManager->createQueryBuilder();
$qb->select('l')
   ->from(PageAboutMetaKeywordLink::class, 'l')
   ->join(MetaKeyword::class, 'k', Join::ON, 'l.reference = k.id') // check these property names (NOT DB COLUMNS!)
   ->where('l.removeDate is null');
可能会有一些小错误,但应该是这样

$repository = $this->entityManager->getRepository(PageAboutMetaKeywordLink::class);
$keywords = $this->entityManager->getRepository(MetaKeyword::class);

$qb = $repository->createQueryBuilder('l');
             $qb ->join('\Application\Entity\MetaKeyword' , 'k')
                 ->expr()->isNull('l.removeDate');

return $qb->getQuery()->getResult();
/**
 * @var int|null
 *
 * @ORM\ManyToOne(targetEntity="MetaKeyword")
 * @ORM\JoinColumn(name="meta_keyword_reference", referencedColumnName="reference")
 * @ORM\Column(name="meta_keyword_reference", type="bigint", nullable=true)
 */
private $metaKeywordReference;
/**
 * @var int|null
 *
 * @ORM\ManyToOne(targetEntity="MetaKeyword")
 * @ORM\JoinColumn(name="meta_keyword_id", referencedColumnName="id", nullable=true)
 */
private $metaKeywordReference;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;

/** @var QueryBuilder $qb */
$qb = $this->entityManager->createQueryBuilder();
$qb->select('l')
   ->from(PageAboutMetaKeywordLink::class, 'l')
   ->join(MetaKeyword::class, 'k', Join::ON, 'l.reference = k.id') // check these property names (NOT DB COLUMNS!)
   ->where('l.removeDate is null');