简体   繁体   English

Doctrine 2类表继承YML

[英]Doctrine 2 Class Table Inheritance YML

I'm trying to use Class Table Inheritance within ZF2 and Doctrine 2. My implementation is pretty simple. 我正在尝试在ZF2和Doctrine 2中使用类表继承。我的实现非常简单。 I think I have the class structure all set, but I think there might be a problem with some setup somewhere. 我认为我已经设置了所有类结构,但我认为某些设置可能存在问题。 Unfortunately, I have found a lot of documentation on the Class setup, but not a whole lot on the YML implementation. 不幸的是,我在类设置上找到了很多文档,但在YML实现上并没有很多。 Everyone seems to resort to using the doctrine tools to generate everything. 每个人似乎都倾向于使用学说工具来生成一切。 With how things are set up, using the doctrine tools is a little problematic, especially when using ZF2. 根据事物的设置方式,使用学说工具有点问题,特别是在使用ZF2时。 Also, I consider this to be a learning opportunity. 此外,我认为这是一个学习机会。 So, here is what I have: 所以,这就是我所拥有的:

The Current Problem: I'm not getting any of the data from the child class/table: 当前问题:我没有从子类/表中获取任何数据:

.array(1) {
[0] =>
class MyCompany\Domain\Model\Customer\CustomerNote#2852 (9) {
  protected $customer =>
  NULL
  protected $note =>
  string(13) "Clever Note 1"
  protected $id =>
  string(1) "1"
  protected $disabled =>
  NULL
  protected $modified =>
  class DateTime#2884 (3) {

    ...

The Generic Notes Class/Table: 通用Notes类/表:

CREATE TABLE generic_notes
(
  note_id serial NOT NULL,
  discriminator character varying(255) NOT NULL, 
  note text,
  created timestamp with time zone NOT NULL DEFAULT now(),
  created_by_id bigint NOT NULL,
  modified timestamp with time zone,
  modified_by_id bigint,
  disabled timestamp with time zone NOT NULL DEFAULT 'infinity'::timestamp with time zone,
  CONSTRAINT generic_notes_pkey PRIMARY KEY (note_id),
  CONSTRAINT generic_notes_created_by_id_fkey FOREIGN KEY (created_by_id)
      REFERENCES users (user_id) MATCH SIMPLE
      ON UPDATE CASCADE 
      ON DELETE RESTRICT,
  CONSTRAINT generic_notes_modified_by_id_fkey FOREIGN KEY (modified_by_id)
      REFERENCES users (user_id) MATCH SIMPLE
      ON UPDATE CASCADE 
      ON DELETE RESTRICT
)

The Customer Notes Class/Table (Inherits Generic Notes): 客户备注类/表(继承通用备注):

CREATE TABLE customer_notes
(
  note_id bigint NOT NULL,
  customer_id bigint NOT NULL,
  CONSTRAINT customer_notes_pkey PRIMARY KEY (note_id),
  CONSTRAINT customer_notes_note_id_fkey FOREIGN KEY (note_id)
      REFERENCES generic_notes (note_id) MATCH SIMPLE
      ON UPDATE RESTRICT 
      ON DELETE RESTRICT,
  CONSTRAINT customer_notes_customer_id_fkey FOREIGN KEY (customer_id)
      REFERENCES customers (customer_id) MATCH SIMPLE
      ON UPDATE R1ESTRICT 
      ON DELETE RESTRICT
)

YML Mapping for Note: 注意YML映射:

MyCompany\Domain\Model\Note:
  type: entity
  table: generic_notes
  inheritanceType: JOINED
  discriminatorColumn:
    name: discriminator
    type: string
    length: 255
  discriminatorMap:
    customer: MyCompany\Domain\Model\Customer\CustomerNote
  id:
    id:
      column: note_id
      type: bigint
      generator:
        strategy: IDENTITY
  fields:
    note:
      type: text
      nullable: true
    created:
      type: datetimetz
    modified:
      type: datetimetz
      nullable: true
    disabled:
      type: datetimetz
      nullable: true
  manyToOne:
    createdBy:
      targetEntity: MyCompany\Domain\Model\User
      joinColumn:
        name: created_by_id
        referencedColumnName: user_id
    modifiedBy:
      targetEntity: MyCompany\Domain\Model\User
      joinColumn:
        name: modified_by_id
        referencedColumnName: user_id

Customer Note Mapping: 客户备注映射:

MyCompany\Domain\Model\Customer\CustomerNote:
  type: entity
  table: customer_notes
  manyToOne:
    customer:
      targetEntity: MyCompany\Domain\Model\Customer
      inversedBy: customerNote
      joinColumn:
        name: customer_id
        referencedColumnName: customer_id

Generic Note Entity 通用注释实体

<?php

namespace MyCompany\Domain\Model;

use MyCompany\Domain\Model\Entity\AbstractEntity;
use MyCompany\Domain\Model\Entity\DisabledTrait;
use MyCompany\Domain\Model\Entity\TimestampedInterface;
use MyCompany\Domain\Model\Entity\TimestampedTrait;

/**
 * Class Note
 *
 * @package MyCompany\Domain\Model
 */

class Note extends AbstractEntity implements TimestampedInterface
{
    use DisabledTrait;
    use TimestampedTrait;

    /**
     * @var string
     */
    protected $note;

    /**
     * @param string $note
     * @return $this
     */
    public function setNote($note)
    {
        $this->note = $note;
        return $this;
    }

    /**
     * @return string
     */
    public function getNote()
    {
        return $this->note;
    }
}

Customer Note Entity: 客户备注实体:

<?php

namespace MyCompany\Domain\Model\Customer;

use MyCompany\Domain\Model\Note;
use MyCompany\Domain\Model\Customer;

/**
 * Class CustomerNote
 * @package MyCompany\Domain\Model\Customer
 */
class CustomerNote extends Note
{
    /**
     * @var \MyCompany\Domain\Model\Customer
     */
    protected $customer;

    /**
     * @param \MyCompany\Domain\Model\Customer $customer
     * @return $this
     */
    public function setCustomer(Customer $customer)
    {
        $this->customer = $customer;
        return $this;
    }

    /**
     * @return \MyCompany\Domain\Model\Customer
     */
    public function getCustomer()
    {
        return $this->customer;
    }
}

Generic Note Fixture Data: 通用注意夹具数据:

generic_notes:
  -
    note_id: 1
    discriminator: customer
    note: Clever Note 1
    created: "2012-01-23 05:43:21.000000"
    created_by_id: 1
    modified: "2012-01-24 05:43:21.000000"
    modified_by_id: 2
    disabled: null

Customer Notes Fixture Data: 客户备注夹具数据:

customer_notes:
  -
    note_id: 1
    customer_id: 1

Everything above is perfectly valid and working. 以上所有内容都非常有效且有效。 It appears that I wasn't including my notes fixture data for the customer notes unit test, and vice-versa. 似乎我没有为客户备注单元测试包括我的笔记夹具数据,反之亦然。 So, a number of days down the hole for my own stupidity. 所以,为了我自己的愚蠢,这几天下来了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM