Доктрина 2.1 - Картиране на обект към множество таблици

Имам следната ситуация с база данни:

wp_users (user table generated by wordpress)
ID | user_login | ... 

wp_sp_user (extension to the wp_users table)
ID (FK) | surname | address | ... 

Сега вече се опитвам с часове да „слея“ тези две таблици в едно цяло User, например:

class User {
  var ID;
  var user_login;
  var surname;
  var address;
  ...
}

Има ли някакъв начин да се постигне такова картографиране, без да се променя таблицата wp_user (което не искам да правя поради причини за актуализиране)?


person MrMuh    schedule 25.08.2011    source източник
comment
stackoverflow.com/questions/18213381 е свързан   -  person Sean the Bean    schedule 05.11.2015


Отговори (2)


Понякога рефакторингът на базата данни не е възможен или таблицата има свой собствен "причина за съществуване". В този случай можете да използвате наследяване. Вашият потребителски клас може да разшири акаунта. Свържете акаунта с wp_users и го разширете с таблицата wp_sp_user. Потребителският клас ще използва колони от двете таблици.

Ето документацията на доктрината:

https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/inheritance-mapping.html

person TlmaK0    schedule 27.09.2013
comment
@MrMuh Това е правилно и полезно, докато приетият отговор е неправилен/остарял. Моля, обмислете това да стане приет отговор. - person Sean the Bean; 05.11.2015
comment

Това е невъзможно. Също така няма смисъл да го правите.

Ще трябва физически да обедините таблиците заедно в MySQL и да създадете обект Doctrine за тази таблица. Това е единственият начин да гарантирате, че вашите данни са чисти и напълно нормализирани.

Друго възможно решение е да се създаде един обект за всяка таблица и да се използва бизнес обект за комбиниране на резултатите от всяка. Това изобщо не е много хубаво решение, тъй като ще трябва да се справите с ограниченията на приложния слой и ще удвоите количеството заявки, които стартирате.

person adlawson    schedule 25.08.2011
comment
+1. Освен това не е добра идея да имате клас, който капсулира данни от няколко таблици на база данни. По-добре обединете таблици в една или проектирайте два класа. В настоящия ви подход това е някакъв вид Divergent Change. Така че рано или късно ще трябва да го преработите. - person J0HN; 26.08.2011
comment
-1 3-тата нормална форма всъщност казва, че можете да разделяте данните въз основа на контекста. Можете да имате 2 таблици потребители и потребителски данни. Но в съответствие с 3-та нормална форма данните за потребителя трябва да бъдат разделени на подробности за адреса (улица, град, държава), лични данни (пол, височина, възраст, доход, без_деца), данни за контакт (телефонен номер, пощенска кутия) и т.н. Doctrine все още е слаб ORM, далеч изостава от тези, които други зрели езици са внедрили. Като пример дори днес той няма пълна поддръжка за обекти със стойност DDD (или колекции от VO). Отговорът ти беше през '11 :) - person Tudor; 06.05.2014
comment
Това е невъзможно. Също така няма смисъл да го правите. Това е неправилно. (Може би беше вярно в Доктрина 1?) Връзката в отговора на @tlmak0 ясно показва, че е възможно. И OP изложи сценарий, в който смятам, че има идеален смисъл двете таблици да се държат отделно, защото те съхраняват логически различни набори от информация (може би ще има случай, в който искате да присвоите потребител на различен WP акаунт? ), и би било разумно да не ги обединявате в интерес на запазването на структурата на WordPress DB. - person Sean the Bean; 05.11.2015