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
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).
@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.
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 :)
@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ść.