konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

Mam problem, z którym nie mogę sobie poradzić.
Mam dwie główne tabele users i clients połączone poprzez tabelę clients_users.

Poglądowy schemat tabel:

Users
id
...

Clients
id
...

Clients_users
client_id
user_id
...


Opis tabel w plikach modelu:


class Client extends AppModel {

var $name = 'Client';

var $hasAndBelongsToMany = array(
'User' => array('className' => 'User',
'joinTable' => 'clients_users',
'foreignKey' => 'client_id',
'associationForeignKey' => 'user_id',
'with' => 'ClientsUser',
'unique' => true
)
);

class User extends AppModel {

var $name = 'User';

var $hasAndBelongsToMany = array(
'Client' => array('className' => 'Client',
'joinTable' => 'clients_users',
'foreignKey' => 'client_id',
'associationForeignKey' => 'user_id',
'with' => 'ClientsUser',
'unique' => true
)
);




Problem:

Teraz chcę w kontrolerze clients pobrać klientów konkretnego usera.

Poniższy kod z niewiadomych mi przyczyn usuwa relację pomiędzy clients i users i mam błąd: Unknown column 'User.id' in 'where clause'

$this->set('data', $this->Client->find('all', array('conditions'=>array('User.id'=>1))));


Jeśli jednak nie daję warunku to ładnie pokazuje mi dane z wszystkich tabel:

$this->set('data', $this->Client->find('all'));


Próbowałem już kombinować na wiele sposobów ale dalej nie chce działać.
Piotr Starzyński

Piotr Starzyński Business controller
/ IT Manager

Temat: HABTM i wyszukiwanie - ciężki orzech ...

a tak znajdzie zle rozwiazania ?:

$this->Client->User->find('all', array('conditions'=>array('User.id'=>1), 'recursive' => 1));

z unbindami przed zapytaniem.

konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

W takim przypadku znajduje mi tylko usera natomiast client zwracany jest jako pusty:
["Client"]=> array(0) { } }

Wywołuje się coś takiego:

SELECT `User`.`id`, `User`.`group_id`, `User`.`company_id`, `User`.`username`, `User`.`password`, `User`.`fname`, `User`.`lname`, `User`.`email`, `User`.`active`, `User`.`created`, `User`.`modified` FROM `users` AS `User` WHERE `User`.`id` = 1

SELECT `Client`.`id`, `Client`.`is_public`, `Client`.`company_name`, `Client`.`nip`, `Client`.`regon`, `Client`.`address`, `ClientsUser`.`client_id`, `ClientsUser`.`user_id`, `ClientsUser`.`is_owner`, `ClientsUser`.`read`, `ClientsUser`.`update`, `ClientsUser`.`delete` FROM `clients` AS `Client` JOIN `clients_users` AS `ClientsUser` ON (`ClientsUser`.`client_id` = 1 AND `ClientsUser`.`user_id` = `Client`.`id`) WHERE 1 = 1


Nie mam pojęcia też, dlaczego w sqlu jest warunek client_id = 1 jak to powinno dotyczyć id usera.

konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

Według mnie na chłopski rozum wszystko powinno bez problemu być pobierane poprzez


$this->set('data', $this->User->Client->find('all', array('conditions'=>array('User.id'=>1))));


Ponieważ wchodzę do User i potrzebuję jego Client. Jeśli szukam bez parametrów to znajduje bez problemu. Jeśli tylko dodam conditions to "gubi" relację. Dlaczego??

konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

W obydwu modelach masz ten sam wpis:
'foreignKey' => 'client_id',
'associationForeignKey' => 'user_id',

konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

Bartosz Gałuszka:
W obydwu modelach masz ten sam wpis:
'foreignKey' => 'client_id',
'associationForeignKey' => 'user_id',

Dzięki za info.

Mam teraz:

'foreignKey' => 'client_id',
'associationForeignKey' => 'user_id',

'foreignKey' => 'user_id',
'associationForeignKey' => 'client_id',

$this->set('data', $this->Client->User->find('all', array('conditions'=>array('user.id'=>1),'recursive'=>1)));


i działa prawidłowo. Jedynie w momencie, gdy robię stronicowanie to jest problem i nie działa, ale myślę, że sobie poradzę :)Dominik - edytował(a) ten post dnia 06.08.09 o godzinie 01:32

konto usunięte

Temat: HABTM i wyszukiwanie - ciężki orzech ...

Przy okazji proponuje używać 'contain' zamiast 'recursive' do pobierania informacji powiązanych z danym modelem/rekordem ( http://book.cakephp.org/view/474/Containable ).Bartosz Gałuszka edytował(a) ten post dnia 06.08.09 o godzinie 15:42

Następna dyskusja:

Saving HABTM VS dokumentacja




Wyślij zaproszenie do