Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Doctrine] Konwertowanie kolumny encji na obiekt
ghost1511
post
Post #1





Grupa: Zarejestrowani
Postów: 186
Pomógł: 18
Dołączył: 2.09.2010

Ostrzeżenie: (0%)
-----


Dopiero zaczynam swoją przygodę z Doctrine i natknąłem się na następujący problem.

Załóżmy, że mamy następującą encję:

  1. <?php
  2.  
  3. use Doctrine\ORM\Mapping as ORM;
  4.  
  5. /**
  6.  * @ORM\Entity
  7.  * @ORM\Table(name="users")
  8.  */
  9. class User {
  10.  
  11. /**
  12.   * @ORM\Id
  13.   * @ORM\GeneratedValue
  14.   * @ORM\Column(type="integer")
  15.   */
  16. private $id;
  17.  
  18. /**
  19.  * @ORM\Column(type="string")
  20.  */
  21. private $email;
  22.  
  23. }


Jak widać User posiada dwa pola
Kod
id (int)
i
Kod
email (string)
. Encja będzie dzialać. Ja natomiast nie chcę aby email był typu string. Chciałbym aby w tym obiekcie email był na przykład obiektem typu Email. W jaki sposób mogę zautomatyzować tę konwersję?

W dokumentacji znalazłem to, ale wydaje mi się, że nie do tego to służy.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


Jeżeli w bazie w kolumnie email bedziesz trzymał email (string) to jest to string, jeżeli referencje do innej tabeli to bedzie tam Mapping.
Możesz też zrobić tak
  1. setEmail(EmailObject $email)
  2. {
  3. // toString czy co tam chesz
  4. }
Go to the top of the page
+Quote Post
ghost1511
post
Post #3





Grupa: Zarejestrowani
Postów: 186
Pomógł: 18
Dołączył: 2.09.2010

Ostrzeżenie: (0%)
-----


Ale nie ma żadnej możliwości żeby obiekt ten encji posiadał EmailObject pod emailem? nie chodzi mi o to aby ręcznie ustawić EmailObject przez setter, tylko żeby encja po pobraniu z bazy od razu konwertowała string na EmailObject.
Go to the top of the page
+Quote Post
destroyerr
post
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Link, który podałeś, służy do rozwiązania Twojego problemu. W taki sposób Doctrine konwertuje daty.
Cytat
Jeżeli w bazie w kolumnie email bedziesz trzymał email (string) to jest to string, jeżeli referencje do innej tabeli to bedzie tam Mapping.

Nie mogę się z tym zgodzić. Doctrine nie ma służyć do zmiany danych z bazy na obiekty, tylko ma utrwalać obiekty w bazie danych. Nie można skupiać się na tym co ma być w bazie tylko na tym co będzie utrwalane. Utrwalanie to ma być przezroczyste, tak jakby w ogóle nie było żadnej bazy danych a obiekty istniały cały czas pomiędzy każdym wywołaniem skryptu.
Go to the top of the page
+Quote Post
ghost1511
post
Post #5





Grupa: Zarejestrowani
Postów: 186
Pomógł: 18
Dołączył: 2.09.2010

Ostrzeżenie: (0%)
-----


Cytat(destroyerr @ 3.10.2014, 10:05:11 ) *
Nie mogę się z tym zgodzić. Doctrine nie ma służyć do zmiany danych z bazy na obiekty, tylko ma utrwalać obiekty w bazie danych. Nie można skupiać się na tym co ma być w bazie tylko na tym co będzie utrwalane. Utrwalanie to ma być przezroczyste, tak jakby w ogóle nie było żadnej bazy danych a obiekty istniały cały czas pomiędzy każdym wywołaniem skryptu.


Czyli co? Czy ja źle pojąłem ideę Encji (Entity) i nie może ona być traktowana jako model? A jedynie ma być ono odwzorowaniem jednego wiersza z tabeli bazy danych. Ignorując w ogóle logikę aplikacji?

Ten post edytował ghost1511 3.10.2014, 09:15:11
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


To co pokazałeś nada się. Przy odczycie konwertujesz do obiektu a przy zapisie do string i tyle.
W laravel w modelu istnieje możliwość użycia Mutatorów np:

  1. function setEmailAttributes($email){}
  2. function getEmailAttributes(){}
Go to the top of the page
+Quote Post
ghost1511
post
Post #7





Grupa: Zarejestrowani
Postów: 186
Pomógł: 18
Dołączył: 2.09.2010

Ostrzeżenie: (0%)
-----


No dobra... W tym przypadku mógłbym utworzyć nowy typ i go odpowiednio konwertować. A teraz taki przypadek:

Rekordy bazy danych:

Kod
EMAIL              NAME           ROW_DATE
it@noname.pl       It office      2014-11-03 00:00:00
office@noname      Some name      2014-11-12 00:00:00


  1. class EmailObject{
  2. public $emailAddress;
  3. public $name;
  4. }


Czy teraz jest możliwa konwersja typów? Tzn z tabeli EMAIL i NAME lądują w obiekcie EmailObject, a po zmianach zapis ląduje w odpowiednich kolumnach w bazie?

Jedyne co mi przychodzi do głowy to w encji usunąć (lub zmienić na prywatne) funkcje getEmailAddres, i getName(). Utworzyć publiczną funkcję getEmailObject korzystający z pól encji.

Ten post edytował ghost1511 3.10.2014, 09:53:14
Go to the top of the page
+Quote Post
destroyerr
post
Post #8





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Teraz to już nie wiem co chcesz zrobić, ale skoro obiekt reprezentujący adres mailowy ma mieć więcej właściwości to musisz zrobić tak jak sugerował skowron-line, czyli wykorzystać mapowanie relacji w Doctrine.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 13:07