2011-11-21 5 views
16

pracuję na miejscu zdarzenia i mieć jeden do wielu relacji między produkcją i jej występów, kiedy mam obiekt wydajności, jeśli muszę jego id produkcyjne w tej chwili muszę zrobićCzy można uzyskać klucz obcy z obiektu w Doctine2 bez ładowania tego obiektu?

$productionId = $performance->getProduction()->getId(); 

W przypadkach, gdy dosłownie potrzebuję identyfikatora produkcji, wydaje się, że odpady wysyłają kolejne zapytanie do bazy danych, aby uzyskać wartość, która jest już gdzieś w obiekcie. Czy jest to możliwe?

+3

Świetne pytanie - Wpadam na to przez cały czas i chciałbym znaleźć sposób na bezpośredni dostęp do wartości klucza obcego bez konieczności dołączania do stowarzyszenia za każdym razem. – cantera

Odpowiedz

27

Edytuj 2013.02.17:
To, co napisałem poniżej, nie jest już prawdą. Nie musisz nic robić w scenariuszu opisanym w pytaniu, ponieważ Doctrine jest na tyle sprytny, aby wczytać pola id do powiązanych obiektów, więc obiekty proxy będą już zawierać identyfikator i nie będzie wywoływać innego połączenia do baza danych.

odpowiedź archiwalna poniżej:

Jest to możliwe, ale jest nierozsądny.

Powodem tego jest Doktryna stara się prawdziwie trzymać się zasady, że twoje istoty powinny tworzyć wykresy obiektów, gdzie klucze obce nie mają miejsca, ponieważ są po prostu "artefaktami", które pochodzą ze sposobu relacyjnych baz danych praca.

Należy przepisać stowarzyszenie będzie

  • chętny załadowany, czy zawsze trzeba podmiotu powiązanego
  • napisać zapytanie DQL (najlepiej na repozytorium) do pobierania dołącz podmiotu powiązanego
  • niech leniwy załaduje powiązany podmiot, wywołując na nim odbiorcę:

Jeśli nie jesteś przekonany i naprawdę chcesz uniknąć wszystkich powyższych, istnieją dwa sposoby (o których wiem), aby uzyskać t id obiektu pokrewnego, bez wyzwalania ładunku i bez uciekania się do sztuczek takich jak odbicie i serializacja:

Jeśli już masz przedmiot w ręku, możesz odzyskać wewnętrzny obiekt, który Doctrine używa wewnętrznie, i użyć go getEntityIdentifier() metoda, przekazując ją nieobciążonemu obiektowi (obiektowi proxy). Zwróci ci identyfikator, bez wyzwalania leniwego obciążenia.

Zakładając, że mamy wiele do jednego stosunku z wielu artykułów należących do kategorii:

$articleId = 1; 
$article = $em->find('Article', $articleId); 
$categoryId = $em->getUnitOfWork()->getEntityIdentifier($article->getCategory()); 

Coming 2.2, będzie można korzystać z funkcji DQL tożsamość, aby wybrać tylko klucz obcy, tak:

SELECT IDENTITY(u.Group) AS group_id FROM User u WHERE u.id = ?0 

Jest to already committed dla wersji rozwojowych.

Mimo to powinieneś naprawdę postarać się trzymać jednej z "poprawnych" metod.

+0

Dziękuję za odpowiedź, po prostu dałem radę i zadziałało idealnie!Sytuacja, którą chcę zrobić, to na przykład generowanie rekomendacji, mam wiele wykonań i potrzebuję identyfikatorów produkcyjnych, dzięki czemu mogę przekazać je obiektowi, który wygeneruje rekomendacje oparte na identyfikatorach produkcyjnych. Wydaje się więc niepotrzebne, aby załadować produkcje, gdy ich nie potrzebuję i naprawdę nie chcę mieć dwóch wersji mojego systemu rekomendacji. Rozważam użycie właściwego systemu, ale w tym przypadku chwytanie identyfikatorów wydaje się najprostszym sposobem. – pogo

+3

Istnieje wiele przypadków użycia, w których wystarczy identyfikator powiązanego obiektu. Myślę, że ze względu na dostrajanie wydajności wskazane jest zerwanie z koncepcją OOP. To na końcu tylko pomoc, która nie powinna spowolnić twojego podania. Jestem wdzięczny za rozwiązania Noberts, ale nie przy jego konceptualnej postawie. – bekay

Powiązane problemy