I think you should try eager loading instead of lazy one. If you combine it with a call to togther() at the beginning of your method’s chain, which will set CDbCriteria’s together property to true, then it should give you one query.
Ttry calling together() before calling with() in a chain. Like that:
$data = Product::model()->together()->with(...)
Also if you are using relation names you don’t have to use array inside with(). Just put there relation names as function arguments. Check this. If it complains about not unique names, then maybe last relation should be declared as array with additional options? Hard to say…