2013-06-11 39 views
7

Tôi đang phát triển một ứng dụng trong Symfony 2.3 với Doctrine 2.4 như ORM. Công cụ cơ sở dữ liệu tôi sử dụng là PostgreSQL. Tôi gặp sự cố khi ánh xạ các đối tượng có khóa chính kết hợp trong các bảng khác. Các phím này là các khóa lạ trong khóa liên quan.Symfony2 Doctrine ORM Composite Primary Keys

Các bảng trong cơ sở dữ liệu của tôi có cấu trúc sau

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

Xác định thực thể establecimientoSecPlano, biến $ establecimientoSec ​​chứa các phím $ establecimiento và $ id_establecimiento_sec

// Entity/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; 

// Pháp nhân/EstablecimientosSec

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

Khi thực hiện học thuyết lệnh: lập bản đồ: import tôi nhận được lỗi sau

[Học thuyết \ ORM \ Mapping \ MappingException] Không thể để lập bản đồ thực thể 'EstablecimientoSec' với một khóa chính tổng hợp như một phần của khóa chính của một thực thể khác 'EstablecimientoSecPlano # idEstablecimiento'.

Tôi tự hỏi nếu có cách nào để xác định các thực thể trong symfony và tôi không thể làm với học thuyết.

Tôi có thể ánh xạ các đối tượng địa lý theo cách khác để ứng dụng hoạt động chính xác không?

Tôi hy vọng câu hỏi của tôi được hiểu. cảm ơn

+0

Bất kỳ tỷ lệ cược nào đều hữu ích? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

+0

thăm dò giải pháp đó nhưng không thành công, cảm ơn anyway @Denis – Guillermo

+1

Bạn * có thể * làm việc xung quanh điều này bằng cách gán ID đơn cột độc lập, được tạo tự động cho tất cả các bảng và sử dụng 'id_establecimiento_sec_plano',' id_establecimiento_sec' và 'id_establecimiento' làm trường. (bạn không cần phải có cùng một trường trong nhiều bảng/thực thể khi bạn có thể truy cập các trường đó bằng cách sử dụng quan hệ). I E.* if * Tôi hiểu vấn đề của bạn một cách chính xác. – schemar

Trả lời

1

Bạn đang gặp phải sự cố này bởi vì khóa ngoài tổng hợp của bạn là khóa chính của bảng tổng hợp khác. Đây không phải là một thực hành phát triển tốt, đó là lý do tại sao nó không được hỗ trợ bởi Doctrine, và tôi thực sự nghi ngờ rằng nó sẽ mãi mãi.

Giải pháp 1 (ưu tiên):

Thêm một duy nhất, khóa chính auto-increment để EstablecimientosSec. Sau đó, bạn có thể liên kết đến số đó EstablecimientosSec.id.

Giải pháp 2:

Nếu thay đổi cấu trúc cơ sở dữ liệu là hoàn toàn không thể, không lập bản đồ các mối quan hệ. Thay vào đó, bạn có thể tìm nạp các thực thể có liên quan EstablecimientosSec trong một truy vấn riêng biệt bằng cách sử dụng khóa chính kết hợp. Nó không phải là một giải pháp hoàn hảo, nhưng nó hoạt động theo những ràng buộc này. Mẹo: tránh truy vấn các đối tượng liên quan như một phần của vòng lặp.

+0

Xin lỗi vì câu trả lời sau, cuối cùng tôi đã sử dụng Giải pháp 1. Cảm ơn! – Guillermo

Các vấn đề liên quan