Wpis z mikrobloga

Jak w frameworku Yii pobrać dane z "kilkustopniowej" relacji? Przykładowo powiedzmy, że mam tabelki User, Order i Item. (założenie, że User ma tylko jeden Order i Order ma tylko jeden Item).

I teraz np jak chcę pobrać aktualny Order wprost z modelu User:

function getCurrentOrder()
{
return $this->hasOne(Order::className(), ['id' => 'currentOrderId'])
}

I teraz, jak pobrać dane z drugiego stopnia zagnieżdzenia? Tzn z modelu User pobrać bezpośrednio aktualny Item.

#webdev #programowanie #php (tak, wiem, he - he) #yii
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Dla potomnych:

$currentItem= $this->hasOne(Item::className(), ['id' => 'itemId'])
->via("currentOrder");

Co i tak nie pomogło, bo generowało tyle samo zapytań do bazy co użycie bezpośrednio 'attribute' => 'currentOrder.currentItem.name' w DataColumn. Słowo klucz do rozwiązania - "eager loading", domyślnie jest Lazy, gdzie relacje są ładowane dopiero przy ich użyciu (a więc każda z osobna).
  • Odpowiedz
@Jurigag: Sam na to wpadłem ( ͡° ͜ʖ ͡°)

Słowo klucz do rozwiązania - "eager loading", domyślnie jest Lazy, gdzie relacje są ładowane dopiero przy ich użyciu (a więc każda z osobna).
  • Odpowiedz
@Jurigag: Cała idea eager loadingu polega właśnie na tym, żeby tych dodatkowych zapytań nie było, bo w takim razie po co rezygnować z lazy loadingu? Tak czy inaczej, żadne dodatkowe zapytania do bazy nie powstają, dla 50 wyświetlanych rekordów leci 17 zapytań, z tego dobra połowa niezwiązana z nimi.
  • Odpowiedz
dla 50 wyświetlanych rekordów leci 17 zapytań


@NieUsune: WTF

to ci się dzieje własnie z eager loadingu xD zresztą nie wiem co ty robisz tam, ale po co ci 17 zapytań ? ;o

ja zawsze korzystam z query buildera, dla mnie eager loadingu to rozwiązanie dla lamusów powodujące tysiące problemów i bottlenecków, omijaj eager loading z daleka jak tylko możesz i twoje życie stanie się lepsze :)
  • Odpowiedz
@Jurigag: W poście podałem uproszczony przykład, pracuje nad sporym systemem, ale pierwszy raz coś, co nie jest napisane w Symfony ( ͡° ͜ʖ ͡°) Bez eager loadingu faktycznie jest kilka zapytań mniej, ale tak czy inaczej 17 to akceptowalna wartość.
  • Odpowiedz
@NieUsune: ja tam i tak jade na phalconie + angular, także zwykle wpisanie andresu i kliknięce enter to u mnie 1-2 zapytania do bazy ( ͡° ʖ̯ ͡°) czasem więcej ale rzadko kiedy, zależy jeszcze w sumie od strony
  • Odpowiedz