#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, не будучи двунаправленным?