Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] Relacje
Forum PHP.pl > Forum > PHP > Frameworki
Pyton_000
Witajcie.

Mam mały problem z prostymi relacjami w Ciasteczku.

Najpierw diagram


Relacje w Cake:

Dla Planet mam ustawioną relację
- belongsTo Player, foreign_key = player_id

Dla Player mam relacje:
- hasMany Planet, foreign_key = player_id
- belongsTo Alliance foreign_key = alliance_id

Dla Alliance
- nasOne Player foreign_key = alliance_id

Probelm.
Muszę pobrać wszystkie rekordy z Planet o określonych warunkach. Dostaję np. 7 wyników
Z automatu pobiera mi się gracz przypisany do Planet po id (czyli jest ok).

Teraz chciałbym żeby jeszcze dossało się Ally przypisane do Player jeżeli jest zdefiniowane.
No i tu problem bo nie bardzo wiem jak sobie z tym poradzić.
Chcąc odwołać się przez
Kod
$this->Player->Alliance->find()

nie zwraca mi poprawnie wyników, chyba że ja nie umiem skonstrułować warunków biggrin.gif

Jeżeli coś trzeba dpoisać to pytajcie.
kicaj
Relacje są takie:
Player hasMany Planet (Planet belongsTo Player)
Alliance hasOne Player (Player belongsTo Alliance)

Wywołanie $this->Player->find('all') powinno zwrócić tablice m.in z relacją Alliance z domyślnie ustawioną rekurencją.

Pokaż ustawienia relacji w modelach.
Pyton_000
*r4xz - tego nie widziałem smile.gif Muszę poczytać i się zainteresować bo to cyba rozwiąże mój problem
*kicaj
Planet
Kod
public $belongsTo = array(
        'Player' => array(
            'className' => 'Player',
            'foreignKey' => 'player_id'
        )
    );

Player
Kod
public $hasMany = array(
        'Planet' => array(
            'className' => 'Planet',
            'foreignKey' => 'player_id',
            'dependent' => true
        )
    );
    public $belongsTo = array(
        'Alliance' => array(
            'className' => 'Alliance',
            'foreignKey' => 'alliance_id'
        )
    );

Alliance
Kod
public $hasOne = array(
        'Player' => array(
            'className' => 'Player',
            'foreignKey' => 'alliance_id'
        )
    );


Jak widać bardzo skromnie smile.gif

PS. Operację pobierania danych wykonuję w modelu Planet bo to ona jest głównym pkt. zaczepienia do wyświetlania informacji

--- EDITED ---
Udało mi się rozwiązać tem problem.
Wybawieniem było containable

W modeli Bazowym do zapytania o planety dodałem:
Kod
'contain' => array(
                    'Player' => array('Alliance')
                )

i zadziałało tak jak chciałem smile.gif

Dziękuję za nakierowanie i pozdrawiam Ciastkowiczów smile.gif
r4xz
PS Warto dodać w AppModel:
  1. public $recursive = -1;

Dzięki temu mamy większą kontrole nad zapytaniami (domyślnie pobiera dane tylko z jednego modelu) i dostosowujemy tą wartość w zależności od potrzeby przed każdym zapytaniem wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.