Отношения модели Symfony 2.0

#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()