1

Temat: Problem z $recursive

Problem podobny do opisanego tutaj.
Mam 3 tabele corporations, towns, regions. Oczywiście w corporations jest kolumna town_id, no i w towns jest kolumna region_id.

Modele:

class Corporation extends AppModel
{
    var $name='Corporation';
    var $belongsTo='Town';
}
class Town extends AppModel
{
    var $name='Town';
    var $belongsTo='Region';
}
class Region extends AppModel
{
    var $name='Region';
}

I teraz wywołując w kontrolerze corporations_controller

$this->set('corporation',$this->Corporation->findAll("ORDER BY Corporation.name ASC"));

chciałbym uzyskać też informację taką jak Region.name

Zmieniłem więc model corporations na

class Corporation extends AppModel
{
    var $name='Corporation';
    var $recursive=2;
    var $belongsTo='Town';
}

i nadal lipa ;( Tak jakby recursive w ogóle nie działało... Może trzeba gdzieś w konfigu coś zamieszać?

Mimo iż recursive jest ustawione na 2, SQL zwraca:

SELECT `Corporation`.`id`, `Corporation`.`name`, `Corporation`.`town_id`, `Town`.`id`, `Town`.`name`, `Town`.`region_id` FROM `corporations` AS `Corporation` LEFT JOIN `towns` AS `Town` ON (`Corporation`.`town_id` = `Town`.`id`) ORDER BY `Corporation`.`name` ASC

Czyli efekt jest taki sam jak wtedy gdy recursive jest ustawione na 0 lub na 1. Nie wiem, może coś robię źle, proszę o pomoc...

2

Odp: Problem z $recursive

Usuń z modelu $recursive = 2;

W kontrolerze tuż przed findAll() dodaj $this->recursive = 2;
Twoja funkcja findAll() powinna wyglądać tak : $this->Corporation->findAll(null,null, 'Corporation.name desc');

Ewentualnie możesz podać recursive również w findAll() : $this->Corporation->findAll(null,null, 'Corporation.name desc',null,null, 2);

Natomiast wg nowych standardów może to wyglądać jeszcze tak:
$this->Corporation->find('All', array('order'=>array('Corporation.name desc'), 'recursive'=>2));

Ostatnio edytowany przez maciek (2008-09-26 12:11:58)

3

Odp: Problem z $recursive

Próbowałem już te kombinacje...

SQL zwraca

SELECT `Corporation`.`id`, `Corporation`.`name`, `Corporation`.`town_id`, `Town`.`id`, `Town`.`name`, `Town`.`region_id` FROM `corporations` AS `Corporation` LEFT JOIN `towns` AS `Town` ON (`Corporation`.`town_id` = `Town`.`id`) WHERE 1 = 1 ORDER BY Corporation`.`name` DESC

Ciągle brakuje LEFT JOIN'a z tabelą regions...

No nic, będę musiał to załatwić długim, niechlujnym i niezgodnym z ideą programowania obiektowego $this->model->query()

4

Odp: Problem z $recursive

Czesc,
Nie jestem za dobry w to ale nie powinno byc $hasMany ?

5

Odp: Problem z $recursive

duke_piotr napisał/a:

Czesc,
Nie jestem za dobry w to ale nie powinno byc $hasMany ?

$hasMany byłoby potrzebne gdyby chciał pobrać dla regionów wszystkie miasta, a dla miast wszystkie korporacje. Tak jak jest teraz - jest ok.

Flo, zapomnij o $query(). Tutaj na pewno to nie będzie potrzebne.

Spróbuj, zrobić $this->Corporation->Town->Region->findAll(); Jeśli pobierze Ci wszystkie regiony, to wtedy będzie to już zastanawiające...
Jeśli nie, to spróbuj zdefiniować zmienne $belongsTo w pełni, tzn.


$belongsTo = array(
    'Town' =>array(
        'className'=>'Town',
        'foreignKey'=>'town_id'
    )
);

6

Odp: Problem z $recursive

$this->Corporation->Town->Region->findAll();

daje

SELECT `Region`.`id`, `Region`.`name` FROM `regions` AS `Region`

7

Odp: Problem z $recursive

maciek napisał/a:

$hasMany byłoby potrzebne gdyby chciał pobrać dla regionów wszystkie miasta, a dla miast wszystkie korporacje. Tak jak jest teraz - jest ok.
);

A to nie o to chodzilo w jego problemie? Napisal ze ma jednego left joina i brakuje mu tylko drugiego. W ten sposob robiac findAll pobierze wszystkie Regiony i pasujace do nich Miasta i pasujace do nich Firmy.

Jezeli zle zrozumialem problem to przepraszam smile Jezeli dobrze to wg. mnie brakuje szczegolowego opisu polaczenia baz miedzy Regionami i Firmami, jest jednokierunkowe, a model Miasta powinien laczyc ze soba obydwie tabele.

8

Odp: Problem z $recursive

duke_piotr napisał/a:

A to nie o to chodzilo w jego problemie? Napisal ze ma jednego left joina i brakuje mu tylko drugiego. W ten sposob robiac findAll pobierze wszystkie Regiony i pasujace do nich Miasta i pasujace do nich Firmy.

Wydaje mi się, że skoro jest w kontrolerze Corporation, to chce dla konkretnej korporacji pobrać dane na temat regionu i miasta. Zresztą nie o to się tutaj teraz rozchodzi, bo cokolwiek chce pobrać to i tak powinno to działać już w tej chwili (o ile wszystko jest rzeczywiście dobrze skonfigurowane).

duke_piotr napisał/a:

Jezeli zle zrozumialem problem to przepraszam smile Jezeli dobrze to wg. mnie brakuje szczegolowego opisu polaczenia baz miedzy Regionami i Firmami, jest jednokierunkowe, a model Miasta powinien laczyc ze soba obydwie tabele.

Jeżeli chce pobrać dla danej firmy jej miasto i region, to nie potrzebuje więcej asocjacji niż ma w tej chwili, a ich dodanie tylko spowoduje potrzebę usuwania asocjacji "w locie".


Jeśli natomiast jest tak jak pisze duke_piotr, to wszystko tu jest źle wink

9

Odp: Problem z $recursive

duke_piotr napisał/a:

A to nie o to chodzilo w jego problemie?

Nie, nie o to chodziło. Bazowałem ciągle na tym co mi zwracał SQL, ale okazało się że recursive jednak działa po podejrzeniu składni w debuggerze.
No a mój błąd był taki, że w widoku odnosiłem się do tego na czym mi zależało przez ['Region']['name'], a prawidłowo powinno być ['Town']['Region']['name'].

W każdym bądź razie dzięki za pomoc - chociaż coś się na forum działo wink