Объединение Doctrine-сопоставлений не выполняется в ZF3 - PullRequest
0 голосов
/ 04 марта 2019

Я создаю свое первое сопоставление ассоциаций для объединения.Это также первый раз, когда я использовал внешний ключ в 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_about_meta_keyword_link.meta_keyword_reference ON meta_keyword.reference.Это первый раз, когда я создал внешний ключ в pgSQL.

Это структура таблицы для page_about_meta_keyword_lin k

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)
)

Это запрос, который я создал в Сервисе;Полная служба найдена здесь .

$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();

Созданное мной сопоставление ассоциации предназначено для meta_keyword_reference;Полная сущность найдена здесь .

/**
 * @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.Найдено здесь .

В целом, различные разделы веб-сайта будут использовать мета-ключевые слова.Если я правильно понимаю связь, которую я пытаюсь установить, это ManyToOne.

Я хочу оставить хороший отзыв для других новичков, поскольку они путешествуют с Zend Framework 3 - Doctrine.Пожалуйста, сообщите об изменениях, которые я должен внести в этот пост, чтобы он был ясным, понятным и лаконичным, чтобы я получал необходимую помощь, и другие получат от этого пользу в будущем.

1 Ответ

0 голосов
/ 06 марта 2019

Вы дважды объявили столбец (meta_keyword_reference).Глядя на документы (ту же страницу, на которую вы ссылались в вопросе), вы допустили ошибку в своей аннотации.Удалите строку 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;

Не беспокойтесь об объявлении «типа», Doctrine автоматически сопоставит его со столбцом, на который вы ссылаетесь.Кроме того, вы должны ссылаться на первичные ключи.Я предположил, что reference - это , а не ПК, поэтому я изменил его на 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');

Может бытьЕсть несколько небольших ошибок, но это должно быть об этом.

...