#php #doctrine-orm #symfony
#php #доктрина-orm #symfony
Вопрос:
Я пытаюсь смоделировать следующую структуру таблицы в Symfony 2.0, используя аннотации.
State
PK Code
Name
County
PK State_Code -> FK State.Code
PK Code
Name
Muni
PK State_Code -> FK.State.Code
PK County_Code -> FK County.Code
PK Code
Name
Моделирование полей и взаимосвязи «штат — округ» достаточно простое, но я не могу определить, как определить взаимосвязь для таблицы Muni.
- В штатах есть один или несколько округов.
- В округах есть один или несколько муниципальных образований.
- Муниципалитеты принадлежат одному или нескольким округам.
Структура таблицы является устаревшей и не может быть изменена.
Комментарии:
1. Ну, как бы вы описали отношения по-английски?
2. Я обновил вопрос подробностями отношений. База данных является устаревшей и не может быть изменена.
3. Я восстановил свой ответ, кажется, теперь он работает должным образом.
Ответ №1:
Вот так. Протестировано с помощью Symfony 2.0.5 (Doctrine 2.1):
State.php
namespace AcmeWhateverBundleEntity;
use DoctrineORMMapping as ORM;
/**
* State
*
* @ORMEntity
*/
class State
{
/**
* @ORMId()
* @ORMGeneratedValue(strategy="NONE")
* @ORMColumn(name="Code", type="integer")
*/
private $code;
/**
* @ORMColumn(name="Name", type="string")
*/
private $name;
/**
* @ORMOneToMany(targetEntity="County", mappedBy="state_code")
*/
private $counties;
/**
* @ORMOneToMany(targetEntity="Muni", mappedBy="state_code")
*/
private $munis;
}
County.php
namespace AcmeWhateverBundleEntity;
use DoctrineORMMapping as ORM;
/**
* County
*
* @ORMEntity()
*/
class County
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMColumn(name="Code", type="integer")
*/
private $code;
/**
* @ORMColumn(name="Name", type="string")
*/
private $name;
/**
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMManyToOne(targetEntity="State", inversedBy="counties")
* @ORMJoinColumn(name="State_Code", referencedColumnName="Code")
*/
private $state_code;
/**
* @ORMOneToMany(targetEntity="Muni", mappedBy="county_code")
*/
private $munis;
}
Muni.php
namespace AcmeWhateverBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Muni
*
* @ORMEntity
*/
class Muni
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMColumn(name="Code", type="integer")
*/
private $code;
/**
* @ORMColumn(name="Name", type="string")
*/
private $name;
/**
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMManyToOne(targetEntity="County", inversedBy="munis")
* @ORMJoinColumn(name="County_Code", referencedColumnName="Code")
*/
private $county_code;
/**
* @ORMId
* @ORMGeneratedValue(strategy="NONE")
* @ORMManyToOne(targetEntity="State", inversedBy="munis")
* @ORMJoinColumn(name="State_Code", referencedColumnName="Code")
*/
private $state_code;
}
Не забудьте сгенерировать средства получения / установки. Все отношения являются двунаправленными.
Комментарии:
1. Будет ли это работать и со свойствами навигации? Если бы я попытался сделать County-> getMunis()
2. Я отредактировал ответ. Все отношения теперь двунаправленные, поэтому вы можете использовать
$county->getMunis()