Mam model User, na którego składają się zawsze jeden Adres, i jeden lub więcej Samochodów.
I teraz dylemat polega na tym w jaki sposób dodawać model User?
Opcja 1:
Czy w akcji dodaj, kontrolera users po kolei stworzyć obiekty składowych modeli, dodać je (oczywiście zgodnie z kolejnością wymuszoną strukturą bazy i odwołaniami kluczy obcych) przypisując odpowiednio wartości kluczy obcych?
<?php /** * Kontroler (modele standardowe) */ class Users_Controller extends Controller { public function dodaj() { // start transaction $adres = new Adres_Model(); $adres->add(); // najpier dodaje adres, bo z racji tego, że user może mieć tylko jeden adres // uznałem, że id rekordu adresu powinno znajdować się w tabeli User $user = new User_Model(); $user->adres_id = $adres->id; $user->add(); $car = new Car_Model(); $car->user_id = $user->id; $car->add(); // commit } } ?>
Opcja 2:
Czy może w akcji dodaj, kontrolera users wywołać metodę add() obiektu reprezentującego model User, a odpowiednie składowe modelu User, pododawać wewnątrz metody add()

<?php /** * Model */ class User_Model extends Model { public function add() { $adres = new Adres_Model(); $adres->save(); $this->adres_id = $adres->id; $this->save(); $car = new Car_Model(); $car->user_id = $this->id; $car->save(); } } /** * Kontroler */ class Users_Controler extends Controller { public function dodaj() { $user = new User_Model(); // start transaction $user->add(); // commit } } ?>
Wybierając opcję 1 mam mniej powiązane ze sobą modele. Ale za to nawalone w kontrolerze kodu co przeczy zasadzie chudy kontroler gruby model.
Opcja 2 jest bardziej intuicyjna, kontroler raczej nie powinien być świadom z czego się skłąda user. Ma dodać usera i koniec. Obiekt Usera wie co jest mu do życia potrzebne i sobie to sam dodaje.
A może są jeszcze jakieś inne opcje??
Kłaniają się tu pewnie wzorce projektowe. Może jakaś fabryka Userów ?