Подключение нескольких объектов к объекту locations с составным первичным ключом

#php #doctrine-orm #doctrine

#php #doctrine-orm #доктрина

Вопрос:

У меня есть некоторые объекты, которые определяют местоположения таким образом, что:

Города

 /**
 * cities
 *
 * @ORMEntity
 * @ORMTable(name="cities")
 */
class cities
{
    /**
     * @var int
     *
     * @ORMId
     * @ORMColumn(name="id", type="integer")
     * @ORMGeneratedValue(strategy="NONE")
     */
    private $id;

    /**
     * @var string
     *
     * @ORMId
     * @ORMColumn(name="lang", type="string", length=5)
     * @ORMGeneratedValue(strategy="NONE")
     */
    private $lang;

    /**
     * @var Provinces
     *
     * @ORMManyToOne(targetEntity="Provinces")
     * @ORMJoinColumns({
     *   @ORMJoinColumn(name="id_province", referencedColumnName="id"),
     *   @ORMJoinColumn(name="lang", referencedColumnName="lang")
     * })
     */
    private $idProvince;

    /**
     * @var int
     *
     * @ORMColumn(name="id_region", type="integer")
     */
    private $idRegion;

    /**
     * @var int
     *
     * @ORMColumn(name="id_country", type="integer")
     */
    private $idCountry;

    /**
     * @var string
     *
     * @ORMColumn(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @var geometry
     *
     * @ORMColumn(name="chords", type="geometry", nullable=false)
     */
    private $chords;
    
    // ... getters and setters
}

 

За этим следует объединение провинций, регионов и стран, которые имеют аналогичную структуру. Поскольку у каждого города есть идентификатор, я создаю составной индекс ID-LANG, в котором у меня есть город, например Мадрид, с идентификатором: 125 и этот на пяти языках:

  • ID: 125 LANG: ES
  • ID: 125 ЯЗЫК: RU
  • ID: 125 ЯЗЫК: FR
  • ID: 125 ЯЗЫК: PT
  • ID: 125 ЯЗЫК: IT

Этот объект будет подключен ко всем объектам, в которых вам нужно сохранить адрес. И чтобы иметь возможность использовать разные языки, я не использую название города, а скорее использую его идентификатор и показываю название в зависимости от языка, на котором пользователь переходит.

Примером объекта, в котором мне нужен адрес, является, например, бизнес-объект:

 /**
 * Empresas
 *
 * @ORMEntity
 * @ORMTable(name="business")
 */
class Business
{
    /**
     * @var int
     *
     * @ORMId
     * @ORMColumn(name="id", type="integer")
     * @ORMGeneratedValue
     */
    private $id;

    /**
     * @var string
     *
     * @ORMColumn(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @var int
     *
     * @ORMColumn(name="id_city", type="integer")
     */
    private $idCity;

    /**
     * @var int
     *
     * @ORMColumn(name="id_province", type="integer")
     */
    private $idProvince;

    /**
     * @var int
     *
     * @ORMColumn(name="id_region", type="integer")
     */
    private $idRegion;

    /**
     * @var int
     *
     * @ORMColumn(name="id_country", type="integer")
     */
    private $idCounry;

    /**
     * @var string
     *
     * @ORMColumn(name="img", type="string", length=250)
     */
    private $img;

    /**
     * @var Cities
     *
     * @ORMOneToOne(targetEntity="Cities", mappedBy="id") || @ORMOneToMany(targetEntity="Cities", mappedBy="id")
     */
    private $city;

    /**
     * @var Provinces
     */
    private $province;

    /**
     * @var Regions
     */
    private $region;

    /**
     * @var Countries
     */
    private $country;
}
 

Как вы можете видеть в моем коде, я пытаюсь соединить свойство $city с объектом Cities, чтобы получить все данные о городе.

Мне все равно, должен ли он быть OneToOne, чтобы получать и иметь данные о городе уже на их языке, или это должен быть OneToMany, а затем искать в ArrayCollection язык, соответствующий пользователю.

Я бы хотел, чтобы он был однонаправленным от бизнеса к городам, поскольку, если я делаю это двунаправленным (в данном случае у меня нет проблем), накапливается большой объем данных, и мне также нужно вводить свойство в объект city для каждого объекта, который подключается к объекту cities. Поскольку объект cities также будет подключен к другим объектам, таким как пользователи, клиенты, работники и т. Д…

Комментарии:

1. Все это кажется очень странным. Вы создали составной ключ только из-за переводов? Вы позволяете view определять, как должна выглядеть ваша бизнес-модель. Переводы действительно должны были представлять собой отдельную таблицу, на которую можно было бы ссылаться при выборе имени для отображения.

2. @El_Vanja Возможно, я с самого начала ошибаюсь, вы правы. Не могли бы вы немного подробнее объяснить, как бы вы это сделали?

3. Насколько я понимаю, вы могли бы полностью исключить название из модели / таблицы города и иметь таблицу перевода, содержащую все варианты. Вы могли бы организовать его как OneToMany (один город, много переводов). Вы можете сохранить имя на языке по умолчанию внутри модели / таблицы города, но это полностью зависит от вас и способа использования вашего приложения (зависит от того, как часто будет использоваться это значение по умолчанию).

4. @El_Vanja Спасибо за ваш ответ, я изучу то, что вы скажете. Аналогично, в Doctrine нет способа заставить объект owner соединиться с объектом cities, не будучи двунаправленным?