Kamil Olszewski

Kamil Olszewski Specjalista ds
projektów w firmie
Jones Lang LaSalle

Temat: relacje wiele do wielu

Witam,
Dopiero zaczynam przygode z symfony2 ale już natrafiłem na problem z którym nie mogę sobie poradzić.
Mam trzy tablice:diety, posilek produkt. Diety z posiłkiem połaczone są relacja wiele do wielu, tak samo jest z posilek i produkt. Relacje jakie zbudowałem:
Diety
/**
* @ORM\ManyToMany(targetEntity="Posilek", inversedBy="diety")
*/
private $posilki;

Posilek
 /**
* @ORM\ManyToMany(targetEntity="Diety", mappedBy="posilki")
*/
protected $diety;

/**
* @ORM\ManyToMany(targetEntity="Produkt", inversedBy="posilki")
*/
private $produkty;

Produkt
/**
* @ORM\ManyToMany(targetEntity="Posilek", mappedBy="produkty")
*/
protected $posilki;

Chciałem następnie wyświetlić w poszczególnych widokach listy dostępnych rekordów w tabelach. O ile nie ma problemu z wyświetleniem w widoku Diety poszczególnych Posilków
{% include 'MyPortalBundle:Posilek:_list.html.twig' with {'dane': entity.posilki } %} 

gdzie _list.html.twig zawiera pętlę:
{% for posilek in dane %}
<a href="{{ path('posilek_show', { 'id': posilek.id }) }}">
{{posilek}}
{%endfor%}

to wyświetlenie produktów pod posiłkami już nie działa.
{% include 'MyPortalBundle:Produkt:_list.html.twig' with {'dane': entity.produkty } %} 

list.html.twig
{% for produkt in dane %}
<a href="{{ path('produkt_show', { 'id': produkt.id }) }}">
{{ produkt}}
{% endfor %}

Ma ktoś pomysł co robie źle?
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: relacje wiele do wielu

Kamil O.:
Dopiero zaczynam przygode z symfony2 ale już natrafiłem na problem z którym nie mogę sobie poradzić.
Mam trzy tablice:diety, posilek produkt. Diety z posiłkiem połaczone są relacja wiele do wielu, tak samo jest z posilek i produkt. Relacje jakie zbudowałem:
Diety
/**
* @ORM\ManyToMany(targetEntity="Posilek", inversedBy="diety")
*/
private $posilki;

Posilek
 /**
* @ORM\ManyToMany(targetEntity="Diety", mappedBy="posilki")
*/
protected $diety;

/**
* @ORM\ManyToMany(targetEntity="Produkt", inversedBy="posilki")
*/
private $produkty;

Produkt
/**
* @ORM\ManyToMany(targetEntity="Posilek", mappedBy="produkty")
*/
protected $posilki;

Chciałem następnie wyświetlić w poszczególnych widokach listy dostępnych rekordów w tabelach. O ile nie ma problemu z wyświetleniem w widoku Diety poszczególnych Posilków
{% include 'MyPortalBundle:Posilek:_list.html.twig' with {'dane': entity.posilki } %} 

gdzie _list.html.twig zawiera pętlę:
{% for posilek in dane %}
<a href="{{ path('posilek_show', { 'id': posilek.id [/quote]> }) }}">[quote] {{posilek}}
{%endfor%}

to wyświetlenie produktów pod posiłkami już nie działa.
{% include 'MyPortalBundle:Produkt:_list.html.twig' with {'dane': entity.produkty } %} 

list.html.twig
{% for produkt in dane %}
<a href="{{ path('produkt_show', { 'id': produkt.id [/quote]> }) }}">[quote] {{ produkt}}
{% endfor %}

Ma ktoś pomysł co robie źle?
Uwaga. Dobrze byłoby abyś podawał treść błędu jaki się pojawia.

Zauważ, że Posilek zawiera Produkty. Oznacza to, że w taki sposób jak chcesz wyświetlać dane należy to zrobić wewnątrz drugiej pętli:
{% for posilek in dane %}
<a href="{{ path('posilek_show', { 'id': posilek.id }) }}">
{{posilek}}
</a>

{% include 'MyPortalBundle:Produkt:_list.html.twig' with {'dane': posilek.produkty } %}
{%endfor%}
Kamil Olszewski

Kamil Olszewski Specjalista ds
projektów w firmie
Jones Lang LaSalle

Temat: relacje wiele do wielu

treści błędu brak, problemem jest to, że nie wyświetla produktów
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: relacje wiele do wielu

Kamil O.:
treści błędu brak, problemem jest to, że nie wyświetla produktów
Testujesz w środowisku "dev"?
Wykonałeś zmianę, którą pokazałem?
Łukasz Wawrzyniak

Łukasz Wawrzyniak Programista,
TMSolution Sp z o.o.

Temat: relacje wiele do wielu

Jeżeli poprawnie uzupełniłeś relacje w db, to na pierwszy rzut oka wygląda ok.
Pokaż co zwraca
 dump(posilek.produkty)
- oczywiście po zmianach Krzysztofa
Kamil Olszewski

Kamil Olszewski Specjalista ds
projektów w firmie
Jones Lang LaSalle

Temat: relacje wiele do wielu

Zauważ, że Posilek zawiera Produkty. Oznacza to, że w taki sposób jak chcesz wyświetlać dane należy to zrobić wewnątrz drugiej pętli:
{% for posilek in dane %}
<a href="{{ path('posilek_show', { 'id': posilek.id }) }}">
{{posilek}}
</a>

{% include 'MyPortalBundle:Produkt:_list.html.twig' with {'dane': posilek.produkty } %}
{%endfor%}

Dziękuje za sugestie ale niestety jestem dalej w punkcie wyjścia. Dlaczego nie musiałem tego stosować gdy przy dietach wyświetlałem posiłki-tam analogicznie miałem, że Diety zawierają Posiłki?
Ogólnie założenie było takie, że do każdego widoku(Dieta, Posiłek, Produkt) mam 3 pliki:index, _list, show.
Po kolei:
index-zaciąga sobie z layouta i dorzuca
{% include 'MyPortalBundle:(Dieta/Posilek/Produkt):_list.html.twig' with {'dane': entities } %}

_list- odpowiednio zależnie gdzie się znajduje wyświetla wszystkie diety/posilki/produkty
show-po kliknieciu na dany/ą Produkt/Diete/Posilek wyswietla dane o nim-tutaj wrzucalem
{% include 'MyPortalBundle:(Dieta/Posilek/Produkt):_list.html.twig' with {'dane': entities.posilki/entities.produkty } %}
czyli dla diet wyswietlał posiłki, dla posiłków produkty. O ile w każdym przypadku index działa bez zarzutu zaciagajac listy(takze produkty wyswietla w ten sposob) to przy odniesieniu z pliku show relacja dieta-posilek działa, posiłek-produkt już nie.
Gdy próbowałem wrzucić pętlę która podpowiedziałeś miałem w"dev"info, że nie ma takich zmiennych-odnosiło się to do "dane", próbowałem też zmienić na "entity in entities" ale entities też twierdził, że brak.
Kamil Olszewski

Kamil Olszewski Specjalista ds
projektów w firmie
Jones Lang LaSalle

Temat: relacje wiele do wielu

nie wiem dlaczego ale nagle po wielu próbach różnych kompinacji stosowania w tym przykładzie początkowy kod zadziałał- choć nie rozumiem dlaczego. Podejrzenie padło na to, że wykonałem polecenie
php app/console doctrine:schema:update --force
. Co prawda wyświetliło komunikat, że wszystko jest "up to date" ale zaraz po tym zaczeło działać. Dziękuje jeszcze raz za podpowiedzi
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: relacje wiele do wielu

Kamil O.:
nie wiem dlaczego ale nagle po wielu próbach różnych kompinacji stosowania w tym przykładzie początkowy kod zadziałał- choć nie rozumiem dlaczego. Podejrzenie padło na to, że wykonałem polecenie
php app/console doctrine:schema:update --force
. Co prawda wyświetliło komunikat, że wszystko jest "up to date" ale zaraz po tym zaczeło działać.
Mimo to nadal nie wiadomo co było przyczyną.
Kamil O.:
Dziękuje jeszcze raz za podpowiedzi
Nie ma sprawy.
Jakub Kądzielawa

Jakub Kądzielawa Software Engineer

Temat: relacje wiele do wielu

Posiadam dwie encje - Messages z polami:

- id
- to_user
- from_user
- createdAt


oraz encję User z polami:

- id

- username

- date_birth

- avatar

- age

- itd....

Chce połączyć ze sobą w jakiś sposób te tabele. Na stronie wiadomości będę przechowywał konkretne wiadomości z informacjami od kogo została przysłana i kiedy. Będzie ona wyświetlała imie uzytkownika ktory przysłal oraz avatar a także wiek itd. .. teraz rodzi się moje pytanie w jaki sposób zrobić takie połączenie ? Rozumiem, że ma to być relacja ManyToMany, zacząłem nawet tworzyć coś takiego w Encjach ale zatrzymalem się przy tworzeniu kolumn do tej nowej tabeli która miałaby się stworzyć. Nie da się zrobić tego prościej? jak wy byście to rozwiązali?
Łukasz Wawrzyniak

Łukasz Wawrzyniak Programista,
TMSolution Sp z o.o.

Temat: relacje wiele do wielu

po co many to many ?
wystarczy manytoone bidirectional, gdzie messages jest "owning side",

to_user i from_user laczysz z uzyszkodnikiem.

btw. stosuj wszędzie taką samą notację, symfony stosuje psr, więc może poczytaj i dostosuj się ? :)

anyway, moze zastosuj bundle :
https://github.com/FriendsOfSymfony/FOSMessageBundle
a jeżeli nie spełnia twoich oczekiwań, to podglądnij rozwiązanie ;)Ten post został edytowany przez Autora dnia 16.08.14 o godzinie 10:24
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: relacje wiele do wielu

Jakub K.:
Posiadam dwie encje - Messages z polami:

- id
- to_user
- from_user
- createdAt


oraz encję User z polami:

- id

- username

- date_birth

- avatar

- age

- itd....

Chce połączyć ze sobą w jakiś sposób te tabele. Na stronie wiadomości będę przechowywał konkretne wiadomości z informacjami od kogo została przysłana i kiedy. Będzie ona wyświetlała imie uzytkownika ktory przysłal oraz avatar a także wiek itd. .. teraz rodzi się moje pytanie w jaki sposób zrobić takie połączenie ? Rozumiem, że ma to być relacja ManyToMany, zacząłem nawet tworzyć coś takiego w Encjach ale zatrzymalem się przy tworzeniu kolumn do tej nowej tabeli która miałaby się stworzyć. Nie da się zrobić tego prościej? jak wy byście to rozwiązali?
Na podstawie tego co podałeś rozwiązanie relacja many-to-one będzie wystarczająca. W Twoim przypadku jeden użytkownik wysyła wiadomość do jednego innego użytkownika. Wiadomość zawiera w sobie informację o jednym adresacie i jednym nadawcy. Dokładnie tak jak Łukasz to rozpisał.

Następna dyskusja:

Doctrine - relacje




Wyślij zaproszenie do