2012-12-12 35 views
7

một câu hỏi khác. Tôi có một thực thể BaseLog trừu tượng giữ liên kết với người dùng của tôi. Ngoài ra tôi có 2 Thực thể (FooLog & BarLog) mở rộng BaseLog. Ngoài ra, tôi có thực thể người dùng của mình, giả sử để giữ hai liên kết với Nhật ký. Một cho FooLog và một cho BarLog. Đây là vấn đề của tôi. Tôi nhận được thông báo lỗi vì tôi không biết cách ghi đè trường inversedBy của BaseLog trong việc mở rộng Thực thể. Liệu bạn có thể giúp mình không.ánh xạ doctrine2 ghi đè trường inversed đã thừa kế được thừa kế từ MappedSuperclass

Bởi vì tôi nghĩ rằng lời giải thích của tôi không thực sự tốt, ở đây là Thiết lập các thực thể của tôi.

BaseLog

/** @ORM\MappedSuperclass */ 
abstract class BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="logs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

FooLog

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    // Some additional fields 
} 

BarLog

/** @ORM\Entity */ 
class BarLog extends BaseLog { 
    // Some additional fields 
} 

tài

/** @ORM\Entity */ 
class User { 
    /** 
    * @ORM\OneToMany(targetEntity="FooLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $fooLogs; 

    /** 
    * @ORM\OneToMany(targetEntity="BarLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $barLogs; 
} 

Làm thế nào để tôi phải ghi đè lên BaseLog 's inversedBy trong FooLog & BarLog.

tôi nhận được nhiều Mapping lỗi trên thiết lập này: BaseLog

  • BaseLog: Hiệp hội BaseLog # người dùng đề cập đến nghịch đảo lĩnh vực bên tài # bản ghi mà không tồn tại.
  • FooLog: Liên kết Người dùng FooLog # đề cập đến trường bên trái In nhật ký người dùng không tồn tại.
  • BarLog: Người dùng BarLog # liên kết đề cập đến trường bên trái In nhật ký người dùng không tồn tại.
  • Người dùng: Ánh xạ Người dùng # fooLogs và người dùng FooLog # không phù hợp với nhau.
  • Người dùng: Ánh xạ Người dùng # barLogs và Người dùng BarLog # không phù hợp với nhau.

Vui lòng giúp tôi sắp xếp ánh xạ của mình.

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi đang đối mặt với một tình huống tương tự. – hafichuk

+0

có thể trùng lặp của [Bản đồ inversedBy ghi đè trong kế thừa Doctrine 2] (http://stackoverflow.com/questions/22745653/overriding-inversedby-mapping-in-doctrine-2-inheritance) – PowerKiKi

+0

@hafichuk, có một câu hỏi trùng lặp với một câu trả lời tuyệt vời trên đó: http://stackoverflow.com/a/22820964/37706 – PowerKiKi

Trả lời

4

Tôi có vấn đề tương tự với kế thừa đơn. Tôi đã giải quyết vấn đề này bằng cách định nghĩa cùng một liên kết trong cả hai lớp thực thể (cha mẹ và được kế thừa) nhưng với tên khác. Trong trường hợp của bạn, bạn có thể thử này:

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="foologs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

và trong lớp BarLog:

/** @ORM\Entity */ 
    class BarLog extends BaseLog { 
     /** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="barlogs") 
     * @ORM\JoinColumns({ 
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
     * }) 
     */ 
     private $bar_user; 
    } 

Thông báo tên khác nhau ($ bar_user). Bạn cũng phải xác định các thuộc tính foolog và barlog trong thực thể người dùng. Thao tác này sẽ xóa các lỗi xác thực học thuyết.

1

IIRC không có cách nào tốt để ghi đè ánh xạ trong các phiên bản cũ hơn của Doctrine. Trong Doctrine> = 2.2 có một cái gì đó gọi là association override vì vậy có thể bạn có thể sử dụng nó.

BTW Tại sao bạn không muốn chuyển các liên kết từ cơ sở đến các lớp cụ thể và xác định inversedBy hợp lệ?

+0

Tôi muốn giữ liên kết trong BaseLog bởi vì nó là mọi thời gian giống nhau ngoại trừ tên var trong thực thể Người dùng. –

+0

Tôi đã xem qua tài liệu được cung cấp nhưng tôi không thể tìm cách ghi đè trường inversedBy. Bất cứ một đề nghị nào khác? –

3

Tôi đã gặp khó khăn với cùng một vấn đề khi sử dụng Single Table Inheritance. Theo như tôi có thể nói không có một giải pháp cho nó.Mặc dù inversedBy được coi là bắt buộc, có vẻ như bạn có thể thoát khỏi với việc bỏ qua nó. Tuy nhiên, như các tài liệu Doctrine cho thấy hiệu suất giảm nhanh chóng.

@AssociationOverride không hữu ích, vì bạn không thể sửa đổi định nghĩa liên kết, chỉ các thuộc tính cột cơ sở dữ liệu.

Tôi đã thử một số tùy chọn, không có tùy chọn nào trong số đó là thỏa đáng.

Cập nhật: Tôi vẫn chưa tìm thấy giải pháp nào cho các loại lỗi này khi chạy app/console doctrine:schema:validate.

[Mapping] FAIL - The entity-class 'Acme\AcmeBundle\Entity\CourseLocation' mapping is invalid: 
* The field Acme\AcmeBundle\Entity\CourseLocation#facilitators is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Acme\AcmeBundle\Entity\CourseFacilitatorResponsibility#courseLocation does not contain the required 'inversedBy' attribute. 

Trong trường hợp này CourseFacilitatorResponsibility là một tầng lớp phụ (với thừa kế bảng duy nhất) của CourseResponsibility. CourseLocation đề cập đến nhiều đối tượng CourseResponsibility. Tôi nghĩ rằng các hiệp hội một hướng là cách duy nhất xung quanh nó.

+0

Tôi cũng gặp phải vấn đề này. Có giải pháp nào bây giờ không? – edditor

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