Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [CakePHP] Relacje
Pyton_000
post
Post #1





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Witajcie.

Mam mały problem z prostymi relacjami w Ciasteczku.

Najpierw diagram
(IMG:http://piotrows.pl/imgs/relacje.png)

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 (IMG:style_emoticons/default/biggrin.gif)

Jeżeli coś trzeba dpoisać to pytajcie.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
r4xz
post
Post #2





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

Ostrzeżenie: (0%)
-----


http://book.cakephp.org/2.0/en/models/mode....html#recursive
lub
http://book.cakephp.org/2.0/en/core-librar...tml#containable
Go to the top of the page
+Quote Post
kicaj
post
Post #3





Grupa: Zarejestrowani
Postów: 1 640
Pomógł: 28
Dołączył: 13.02.2003
Skąd: Międzyrzecz/Poznań

Ostrzeżenie: (0%)
-----


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.

Ten post edytował kicaj 21.08.2013, 20:16:13
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


*r4xz - tego nie widziałem (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Dziękuję za nakierowanie i pozdrawiam Ciastkowiczów (IMG:style_emoticons/default/smile.gif)

Ten post edytował Pyton_000 21.08.2013, 20:46:00
Go to the top of the page
+Quote Post
r4xz
post
Post #5





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)

Ten post edytował r4xz 21.08.2013, 21:58:55
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 05:52