Doctrine Assocation Mapping Join 在 ZF3 中不执行
Doctrine Assocation Mapping Join Not Executing In ZF3
我正在为加入创建我的第一个关联映射。这也是我第一次在 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
我不明白如何传达加入。基于 documentation 我曾预计这是自动的。可能是我理解错了
我想加入的 table 是 page_about_meta_keyword_link.meta_keyword_reference ON meta_keyword.reference。这是我第一次在 pgSQL 中创建外键。
这是 page_about_meta_keyword_link
的 table 结构
CREATE TABLE public.page_about_meta_keyword_link
(
reference bigint NOT NULL DEFAULT nextval('page_about_meta_keyword_link_reference_seq'::regclass),
meta_keyword_reference bigint,
add_date timestamp with time zone DEFAULT now(), -- UTC
add_membership_reference bigint,
remove_date timestamp with time zone, -- UTC
remove_membership_reference bigint,
CONSTRAINT page_about_meta_keyword_link_pkey PRIMARY KEY (reference),
CONSTRAINT page_about_meta_keyword_link_fk FOREIGN KEY (meta_keyword_reference)
REFERENCES public.meta_keyword (reference) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT page_about_meta_keyword_link_reference_unique UNIQUE (reference)
)
这是meta_keyword
CREATE TABLE public.meta_keyword
(
reference bigint NOT NULL DEFAULT nextval('meta_keyword_reference_seq'::regclass),
keyword text,
effective_date timestamp with time zone DEFAULT now(), -- UTC
membership_reference bigint,
CONSTRAINT meta_keyword_pkey PRIMARY KEY (reference),
CONSTRAINT meta_keyword_reference_unique UNIQUE (reference)
)
这是我在服务中创建的查询;已找到完整的 服务 here。
$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();
我创建的Association Mapping供meta_keyword_参考;找到完整的实体 here.
/**
* @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;
我没有对 MetaKeywords 实体进行任何更改。找到 here。
总体而言,网站的各个部分将共享 meta_keyword。如果我理解正确,我试图建立的连接是 ManyToOne。
我想为其他新手留下一个很好的参考,因为他们正在使用 Zend Framework 3 - Doctrine。请告知我应该对此进行的编辑 post 以使其清晰、易懂且简明扼要,以便我获得所需的帮助,其他人将来也会从中受益。
您重复声明了一个列 (meta_keyword_reference
)。查看 the docs(您链接到的同一页面),您在注释中犯了一个错误。删除 ORM\Column
行(定义已在 JoinColumn
中)。如果您需要它可以为空(不需要),请将 nullable=true
添加到 JoinColumn
;使用其中之一,而不是两者
/**
* @var int|null
*
* @ORM\ManyToOne(targetEntity="MetaKeyword")
* @ORM\JoinColumn(name="meta_keyword_id", referencedColumnName="id", nullable=true)
*/
private $metaKeywordReference;
不用担心声明一个 "type",Doctrine 会自动将它匹配到你引用的列。此外,您应该引用主键。我假设 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');
可能有一些小错误,但应该差不多了。
我正在为加入创建我的第一个关联映射。这也是我第一次在 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
我不明白如何传达加入。基于 documentation 我曾预计这是自动的。可能是我理解错了
我想加入的 table 是 page_about_meta_keyword_link.meta_keyword_reference ON meta_keyword.reference。这是我第一次在 pgSQL 中创建外键。
这是 page_about_meta_keyword_link
的 table 结构CREATE TABLE public.page_about_meta_keyword_link
(
reference bigint NOT NULL DEFAULT nextval('page_about_meta_keyword_link_reference_seq'::regclass),
meta_keyword_reference bigint,
add_date timestamp with time zone DEFAULT now(), -- UTC
add_membership_reference bigint,
remove_date timestamp with time zone, -- UTC
remove_membership_reference bigint,
CONSTRAINT page_about_meta_keyword_link_pkey PRIMARY KEY (reference),
CONSTRAINT page_about_meta_keyword_link_fk FOREIGN KEY (meta_keyword_reference)
REFERENCES public.meta_keyword (reference) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT page_about_meta_keyword_link_reference_unique UNIQUE (reference)
)
这是meta_keyword
CREATE TABLE public.meta_keyword
(
reference bigint NOT NULL DEFAULT nextval('meta_keyword_reference_seq'::regclass),
keyword text,
effective_date timestamp with time zone DEFAULT now(), -- UTC
membership_reference bigint,
CONSTRAINT meta_keyword_pkey PRIMARY KEY (reference),
CONSTRAINT meta_keyword_reference_unique UNIQUE (reference)
)
这是我在服务中创建的查询;已找到完整的 服务 here。
$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();
我创建的Association Mapping供meta_keyword_参考;找到完整的实体 here.
/**
* @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;
我没有对 MetaKeywords 实体进行任何更改。找到 here。
总体而言,网站的各个部分将共享 meta_keyword。如果我理解正确,我试图建立的连接是 ManyToOne。
我想为其他新手留下一个很好的参考,因为他们正在使用 Zend Framework 3 - Doctrine。请告知我应该对此进行的编辑 post 以使其清晰、易懂且简明扼要,以便我获得所需的帮助,其他人将来也会从中受益。
您重复声明了一个列 (meta_keyword_reference
)。查看 the docs(您链接到的同一页面),您在注释中犯了一个错误。删除 ORM\Column
行(定义已在 JoinColumn
中)。如果您需要它可以为空(不需要),请将 nullable=true
添加到 JoinColumn
;使用其中之一,而不是两者
/**
* @var int|null
*
* @ORM\ManyToOne(targetEntity="MetaKeyword")
* @ORM\JoinColumn(name="meta_keyword_id", referencedColumnName="id", nullable=true)
*/
private $metaKeywordReference;
不用担心声明一个 "type",Doctrine 会自动将它匹配到你引用的列。此外,您应该引用主键。我假设 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');
可能有一些小错误,但应该差不多了。