как моделировать наследование в doctrine2 с yaml? - PullRequest
4 голосов
/ 07 июня 2011

Как объявить наследование doctrine2 способом yaml?

Я не нахожу никаких фрагментов кода, примеров или статей об этом в документации доктрины.

Когда я пробую путь doctrine1, я получаю сообщение об ошибке, что у сущности нет первичного ключа.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Попробуйте выполнить простое наследование модели, используя examples в документации (в формате @Annotations), и преобразовать их в yaml с помощью инструмента командной строки doctrine с параметрами orm: convert-отображение (которое преобразует информацию отображения между поддерживаемыми форматами).Больше информации здесь .

2 голосов
/ 13 июля 2017

Существует несколько различных типов наследования в Doctrine2.Вот примеры двух наиболее распространенных типов:


Отображенный суперкласс

# MyProject.Model.Person.dcm.yml
MyProject\Model\Person:
  type: mappedSuperClass
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string
      length: 50
   ...

# MyProject.Model.EmployedPerson.dcm.yml
MyProject\Model\EmployedPerson:
  type: entity
  fields:
    occupation:
      type: string
      length: 100
    ...

Затем в ваших классах PHP:

# Person.php

<?php
namespace MyProject\Model;
class Person
{
    private $id;
    private $name;

   // Add public getters and setters
}

# EmployedPerson.php

<?php
namespace MyProject\Model;
class EmployedPerson extends Person
{
    private $occupation;

    // Add public getters and setters
}

Есть две основные вещи, которые вам нужно сделать, чтобы сделать эту работу: используйте type: mappedSuperClass вместо type: entity на родительском и чтобы ваш дочерний класс PHP расширял родительский класс.

Вы можетеДобавьте любые поля и отношения, которые вам нужны, к любому классу, хотя вы должны отметить предупреждение в документах относительно отношений, которые вы можете добавить к родителю:

Сопоставленный суперкласс не может быть сущностью, это неустойчивые к запросу и постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными (только со стороны владельца).Это означает, что связи «один ко многим» вообще не возможны для сопоставленного суперкласса.Более того, ассоциации «многие ко многим» возможны только в том случае, если сопоставленный суперкласс используется только в одном объекте в данный момент.Для дальнейшей поддержки наследования необходимо использовать функции наследования одиночной или объединенной таблицы.


Наследование для одной таблицы

Удобно, документыуже приведем пример конфигурации YAML для наследования одной таблицы:

MyProject\Model\Person:
  type: entity
  inheritanceType: SINGLE_TABLE
  discriminatorColumn:
    name: discr
    type: string
  discriminatorMap:
    person: Person
    employee: Employee

MyProject\Model\Employee:
  type: entity
0 голосов
/ 16 июня 2014

Существует три основных стратегии управления наследованием в реляционной базе данных.

Вы можете найти, как создать каждую из этих стратегийна веб-сайте Symfony в формате YAML с Doctrine 2: Наследование YAML с Doctrine

...