CActiveRecord relacje

Witam, uczę się własnie jak pisać w tym frameworku i już mam problem z używaniem CActiveRecord a chodzi o to że robie mały sklep i mam

produkt many_many kategoria

produkt many_many atrybut

i mam zrobione klasy produkt, kategorie, atrybut z ustawionymi relacjami jak napisałem wyżej…

i przykładowo pisząc


$sql = Category::model()->with('produkty')->find(array(

		"condition" => "t.id= :cid",

		"params" => array(":cid" => $catid)));

i to działa dobrze pobiera kategorie a w niej produkty należące tylko do tej kategorii

Następnie chce pobrać atrybuty dla każdego z tych produktów


$sql = Category::model()->with('produkty.atrybuty')->find(array(

		"condition" => "t.id= :cid",

		"params" => array(":cid" => $catid)));

działa dobrze czyli pobiera wszytkie atrybuty ale teraz pojawia się problem chce ograniczyć ilość pobieranych produktów dla danej kategorii


$sql = Category::model()->with('produkty.atrybuty')->find(array(

		"condition" => "t.id= :cid",

		"params" => array(":cid" => $catid)

		"limit" => 10,

		"together" => true

));

i tez działa ale ogranicza także ilość pobieranych atrybutów czego nie chcę, a wszelki limit dla produkty w with nic nie dają

Na 90% nie zrobisz tego za pomocą jednego zapytania (z "together" => true). Po prostu spróbuj pobrać najpierw 10 produktów a następnie dla każdego pobrać atrybuty (za pomocą lazy loadingu).

wiem że nie zrobię tego jednym zapytaniem ale bez tego together nie limitowało… a ja chce mieć możliwość ustawienia limitu produktów dla kategorii i np. limitu atrybutów dla każdego z tych produktów

Miałem nadzieję że dzięki tej klasie będę to mógł zrobić za jednym zamachem a framework mi to zwróci. A tu jednak trzeba samemu za pomocą lazy loadingu zagnieżdżać się coraz głębiej

Framework nie jest ci w stanie jednym zapytaniem limitować 2 różnych elementów, bo wynika to ze specyfiki SQL. Możesz spróbować czegoś w tym stylu, ale pisane kompletnie z głowy, nawet nie wiem czy to zadziała:




Category::model()->with(array(

	'produkty' => array(

		"limit" => 10,

		"together" => true,

		'width' => array(

			'atrybuty' => array(

				"limit" => 10,

				"together" => false,

			),

		),

	)

))->find(array(

	"condition" => "t.id= :cid",

	"params" => array(":cid" => $catid)

));



Zainstaluj sobie debug toolbar i sprawdzaj jakie zapytania generuje poszczególny kod.

Inną opcją jest pobieranie bezpośrednio listy produktów bez wykorzystywania do tego modelu kategorii - tak w zasadzie powinno to być zrobione, bo tworzenie takich zapytań z poziomu modelu kategorii to rozwiązanie mocno naokoło.