1

Temat: habtm

Witam,

Mam następujący problem. Posiadam dwie tabele: Orders, Products, ponieważ potrzebuje do jednego zamówienia przypisać wiele produktów skorzystałem z habtm i stworzyłem tabele łączącą orders_products. Model Order i Product  korzystają z 'extendAssociations':

var $actsAs   = array('extendAssociations');

oraz posiadają relację 'hasAndBelongsToMany'.


W kontrolerze orders_controller mam funkcję dodającą zamówienie:

function addOrd() {
        $this->set('products', $this->Order->Product->find('list', array('fields' => array('Product.id', 'Product.Nazwa'))));
        $this->set(compact('products'));

        if (!empty($this->data)) {
            if ( $this->Order->saveAll($this->data)) {
                $this->redirect('/');
            }
        }
    }

W odpowiadającym tej funkcji widoku mam taką formułę:


echo $form->input( 'Product.Product',
             array( 'type'=>'select',
                                'multiple'=>'true',             
                    'options'=>$products,
                                'label'=>'Produkty:'
                              )
               );

Dodaje zamówienie i zaznaczam z ctrl kolejne produkty. Działa poprawnie. Chciałbym jednak dodatkowo do każdego zaznaczonego produktu dodawać ilość sztuk czyli żeby do kazdego rekordu w orders_products dodawać pole 'Sztuki'. Jeśli ktoś wie jak to można zrealizować to będę wdzięczny. Dziękuje z góry.

Pozdrawiam.

2

Odp: habtm

1.
Do tabeli pośredniej orders_products dołącz dodatkową kolumnę.
Ja miałem problemy z działaniem związków HABTM po takim manewrze więc napisałem własny bahavior dla tego modelu.
Z tego co pamiętam udało mi się działać z jedną kolumną dodatkową ale przy 2 już były problemy.

albo prościej

2.
Do modelu Orders dodać hasMany Details. W modelu Details zrobić belongsTo Order. Można też dodać belongsTo Product.
W tym modelu trzymać szczegóły zamówienia tj.

order_id INT UNSIGNED NOT NULL
product_id INT UNSIGNED
ile_sztuk INT UNSIGNED
.....
itd. itp.

Ostatnio edytowany przez alfabeta (2009-06-22 10:13:35)

3

Odp: habtm

Dzięki, problem rozwiązany.

4

Odp: habtm

Witam mam podobny problem. Mam zrobic historie zatrudnienia, dwie tabelki workers i workplaces, tabela laczaca workers_workplaces i przy habtm odczyt danych jest bez problemu, jednakze tabelka przejsciowa musi miec dodatkowa kolumne data, by pamietac kiedy dane stanowisko zostalo zmienione. Przy zapisywaniu nie jest ona wypelniania mimo ze w $this->data ustawiam dodatkowa kolumne.

Wiem ze rozwiazanie jest powyzej, ale cos nie moge skumac - generalnie olac habtm i zrobic recznie tak jak zaporponowal alfabeta?
Czyli stworzyc dowolna tabele (model - wg standardow cakephp - workers_workplaces) i workers dac hasMany workers_workplaces, w workers_workplaces belongsTo worker i belongsTo workplaces?

Ostatnio edytowany przez dredd (2009-07-03 11:11:46)

Junior Caker.
Pozdrawiam!!

5

Odp: habtm

hej. Dokładnie tak jak napisałeś. Z habtm są problemy i chyba najłatwiej jest to zrobić ręcznie ustawiając tabelę łączącą tak jak napisałeś. Bynajmniej ja tak zrobiłem i mogę dodawać dowolną ilość dodatkowych pól.

6

Odp: habtm

Cake przy habtm tworzy automagicznie model WorkersWorkplace, więc możesz spróbować zrobić to w taki sposób:
$this->data['WorkersWorkplace']['dodatkowa_kolumna'] = 'tysioncpińcset';
$this->Worker->save($this->data); //albo saveAll();

daj znać, czy działa.

7

Odp: habtm

A może spróbować w tym modelu WorkersWorkplace dodać funkcje beforeSave i jakoś wypełnić te pole. Nigdy nie próbowałem ale może ...

8

Odp: habtm

@dredd -> a z poziomu SQl nowa kolumna TIMESTAMP nie wystarczy? Nie musisz nic uzupełniac tylko odczytujesz date.

9

Odp: habtm

Witam

id02009 - probowalem tak jak napisales na rozne sposoby, niestety nie dziala, cake operuje tylko na worker_id i workplace_id - dodanie recznie danych nic nie daje hmm imo tak to powinno wygladac

carlin - zrobilem. Dziala, jest tylko blad przy odczycie, ale zapis poprawny. W koncu zrobilem tak, ze ustawilem habtm i sposob alfabeta na raz tongue odczyt realizuje przez habtm, zapis - sposob alfabeta big_smile troszke nie poprawnie z punktu widzenia modelowania bd ale dziala. Co prawda tablica zwracana przez sql jest ekhm... duza, ale to tylko kwestia ustawienia paginacji, by nie bylo ogromnych transferow danych w jednym czasie.

duke_piotr - w sumie nie pomyslalem. Wygodnie jakby baza zalatwila to za cake, tylko nie wiem jak to sie bedzie mialo do polecenia UPDATE czy w kolumnie data, zostanie wstawiona aktualna wartosc czy zostanie ta stara - chodzi tu o poprawienie stanowiska w sytuacji gdy uzytkownik wprowadzajacy pracownika sie pomyli i bedzie chcial mu poprawic stanowisko (a nie zmienic na nowe, obowiazujace od danej daty) - przetestuje to i dam znac jak wyszlo

Dziekuje wszystkim za pomoc i ide walczyc dalej big_smile

Ostatnio edytowany przez dredd (2009-07-06 11:16:56)

Junior Caker.
Pozdrawiam!!

10

Odp: habtm

Zalezy czy dodasz do definicji pola
ON UPDATE CURRENT_TIMESTAMP
czy nie