7

Doctrine 2.4をORMとしてSymfony 2.3でアプリケーションを開発しています。私が使用するデータベース エンジンはPostgreSQLです。エンティティを他のテーブルの複合主キーにマッピングするときに問題が発生します。これらのキーは、関連キーの外部キーです。

私のデータベースのテーブルには次の構造があります

CREATE TABLE public.establecimiento
(
  id_establecimiento integer NOT NULL,
  establecimiento character varying(100) NOT NULL,
  CONSTRAINT pk_establecimiento PRIMARY KEY (id_establecimiento )
)
WITH (
  OIDS=FALSE
);
CREATE TABLE public.establecimiento_sec
(
  id_establecimiento_sec integer NOT NULL,
  id_establecimiento integer NOT NULL,
  det_seccion character varying(40) NOT NULL,
  plano character varying(100),
  sector_ingreso character varying(254),
  sponsor_imagen_sec character varying(96000),
  CONSTRAINT pk_establecimientos_sec PRIMARY KEY (id_establecimiento_sec , id_establecimiento ),
  CONSTRAINT fk_establec_reference_establec FOREIGN KEY (id_establecimiento)
      REFERENCES public.establecimiento (id_establecimiento) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
)
WITH (
  OIDS=TRUE
);
CREATE TABLE public.establecimiento_sec_plano
(
  id_establecimiento_sec_plano integer NOT NULL,
  id_establecimiento_sec integer NOT NULL,
  id_establecimiento integer NOT NULL,
  det_plano character varying(512),
  cantidad integer NOT NULL,
  precio double precision,
  insert_charge double precision DEFAULT 0,
  descr character varying(254),
  CONSTRAINT pk_establecimiento_sec_plano PRIMARY KEY (id_establecimiento_sec_plano , id_establecimiento_sec , id_establecimiento ),
  CONSTRAINT fk_establecimiento_sec FOREIGN KEY (id_establecimiento, id_establecimiento_sec)
      REFERENCES public.establecimiento_sec (id_establecimiento, id_establecimiento_sec) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE
)
WITH (
  OIDS=FALSE
);

エンティティ establecimientoSecPlano の定義、キー $establecimiento および $id_establecimiento_sec を含む $establecimientoSec 変数

//エンティティ/EstablecimientosSecPlano

/**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\EstablecimientosSec")
 * @ORM\JoinColumns(
 *      @ORM\JoinColumn(name="id_establecimiento_sec", referencedColumnName="id_establecimiento_sec"),
 *      @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento")) 
 */
private $establecimientoSec;

//エンティティ/EstablecimientosSec

 /**
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\Establecimientos")
 * @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento") 
 */
private $establecimiento;

コマンド doctrine: mapping: import を実行すると、次のエラーが表示されます

[Doctrine\ORM\Mapping\MappingException] エンティティ「EstablecimientoSec」を別のエンティティ「EstablecimientoSecPlano#idEstablecimiento」の主キーの一部として複合主キーにマップすることはできません。

symfony でエンティティを定義する方法はあるのだろうかと思いますが、doctrine ではできません。

アプリケーションが正しく動作するように、別の方法で機能をマッピングできますか?

私の質問が理解されることを願っています。ありがとう

4

1 に答える 1

2

複合外部キーが別のテーブルの複合主キーであるため、この問題が発生しています。これは良い開発プラクティスではありません。そのため、Doctrine でサポートされていません。

解決策 1 (推奨):

単一の自動インクリメント主キーを に追加しますEstablecimientosSec。その後、EstablecimientosSec.id代わりにリンクできます。

解決策 2:

データベース構造の変更が絶対に不可能な場合は、関係をマップしないでください。EstablecimientosSec代わりに、複合主キーを使用して別のクエリで関連エンティティを取得できます。これは完全な解決策ではありませんが、これらの制約の下で機能します。ヒント: ループの一部として関連オブジェクトを照会することは避けてください。

于 2015-04-08T21:30:42.613 に答える