1

Temat: Problem z relacją M:N (HABTM)

Witam.
Jestem początkującym jeżeli chodzi o Cake'a i frameworki MCV. Zacząłem pisać pewną aplikację i utknąłem na banalnej rzeczy.

Założenie jest takie:
Mam dwie tabele z produktami i rozmiarami. Każdy produkt może mieć wiele rozmiarów, a każdy rozmiar może odnosić się do wielu produktów. Klasyczny przykład relacji M:N, którą rozbiję przy pomocy dodatkowej tabeli.

Mam zatem dane tabele z kluczami:

Product (id)                    
ProductSize (id, product_id, size_id)
Size (id)                                                    

Oraz modele:

class Product extends AppModel
{
    var $name = 'Product';
    var $hasMany = array('ProductSize');
}

class ProductSize extends AppModel
{
    var $name = 'ProductSize';    
    var $belongsTo = array('Product','Size');
}

class Size extends AppModel
{
    var $name = 'Size';
    var $hasMany = array('ProductSize');
}

A w kontrolerze ProductsController:

        $this->Product->recursive = 2;
        $this->set('products', $this->Product->find('all'));

Problem polega na tym, że Cake generuje tylko dwa SELECTy, które obejmują tylko dwie pierwsze tabele tj. Product i ProductSize, nic nie pobiera z tabeli Size. Wogóle dziwna sprawa, bo model wogóle nie reaguje na zmianę recursive'a (recursive próbowałem już ustawiać chyba we wszystkich możliwych miejscach - w klasie modelu, przy find(), w kontrolerze - żadnej róznicy).

Dodam, że pomyślne udało mi się powiązać tabele relacją HABTM w Cake'u, jednakże nie odpowiada mi to z racji tego, że utrudni to aktualizację bardziej złożonych tabel (a przynajmniej tak sugerowano w Cookbooku).

Za wszelkie rady, co tutaj mogłem skopać, będe wdzięczny.

PS. Używam CakePHP 1.2

Ostatnio edytowany przez jermi (2010-02-13 18:08:40)

2

Odp: Problem z relacją M:N (HABTM)

Jeśli tabela pośrednia nie będzie zawierać dodatkowych informacji, to nazywasz ją products_sizes, a w modelaach:
class Product extends AppModel{
var $hasAndBelongsToMany = array("Size");
}
(dla modelu Size: array("Product"))
I Tyle. Nie musisz robić modelu dla tabeli pośredniej.

Jeśli potrzebujesz dane w tabeli pośredniej (np. ilość sztuk produktu w danym rozmiarze), to tworzysz model
ProductsSize, a w pozostałych dwóch modelach:
var $hasAndBelongsToMany = array("Size" =>
  array(
   "className" => "Size",
   "with" => "ProductsSize"
  )
);
}
dzięki "with" cake będzie wiedział, że dodatkowo ma wyciągnąć dane z tabeli pośredniej. Dla modelu ProductsSize możesz też zdefiniować relacje jeśli potrzebujesz smile

Jeśli nie trzymasz się konwencji cake'a to będziesz musiał definiować w relacjach "joinTable", "foreignKey", "associationForeignKey" -> ogólnie więcej roboty...