Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP+Symfony] Powiązanie dwóch tabel
Forum PHP.pl > Forum > PHP
dopelganger
cześć,
usiłuje przełożyć zapytanie:

  1. SELECT comments.*, users.id, users.path
  2. FROM comments
  3. LEFT JOIN users
  4. ON comments.ida=$ida AND comments.idusr=users.id
  5. WHERE comments.view=1
  6. ORDER BY c.datec DESC

na:

  1. $query = $em->createQuery(
  2. 'SELECT c, u
  3. FROM Test\ArticleBundle\Entity\Comment c
  4. LEFT JOIN Test\UserBundle\Entity\User u
  5. WITH c.ida=:ida AND c.idusr=u.id
  6. WHERE c.view=1
  7. ORDER BY c.datec DESC'
  8. )->setParameter('ida',$entity->getId());


niestety otrzymuje błąd:

Method "idusr" for object "Test\UserBundle\Entity\User" does not exist in src/Test/ArticleBundle/Resources/views/Default/show.html.twig at line 8

nie bardzo rozumiem, w klasie User mam id - użytkownika, w klasie Comment mam idusr, czy to chodzi o mapowanie, w sensie że nie mam powiązania między klasami i nie rozpoznaje dla User - idusr ? jeśli tak w jaki sposób to zapisaćquestionmark.gif?

Prosze o pomoc.
Crozin
Co ludzie mają z tym tagowaniem Doctrine'a Symfonym? Przecież to osobne projekty, niezwiązane ze sobą.

1. Doctrine to ORM i operujesz w nim na obiektach i ich właściwościach, a nie SQL-u i kolumnach w bazie danych.
2. W konf. Doctrine'a po to ustawiasz jakie są relację by później nie musieć bawić się nimi przy tworzeniu zapytań DQL (to nie jest SQL).
3. Najprawdopodobniej chcesz osiągnąć coś w stylu:
Kod
SELECT c, u FROM ...Comment c LEFT JOIN c.user u WHERE c.some_entity = :entity AND c.view = [TRUE|1] ORDER BY c.datec DESC
Gdzie parametrem :entity jest zmienna $entity, od biedy samo ID ($entity->getId()). Swoją drogą komentarz może nie mieć autora/użytkownika?
4. Za nazwy ida, idusr, datec ktoś powinien połamać Ci palce. :-)
dopelganger
Cytat(Crozin @ 12.11.2015, 14:42:10 ) *
Co ludzie mają z tym tagowaniem Doctrine'a Symfonym? Przecież to osobne projekty, niezwiązane ze sobą.

1. Doctrine to ORM i operujesz w nim na obiektach i ich właściwościach, a nie SQL-u i kolumnach w bazie danych.
2. W konf. Doctrine'a po to ustawiasz jakie są relację by później nie musieć bawić się nimi przy tworzeniu zapytań DQL (to nie jest SQL).
3. Najprawdopodobniej chcesz osiągnąć coś w stylu:
Kod
SELECT c, u FROM ...Comment c LEFT JOIN c.user u WHERE c.some_entity = :entity AND c.view = [TRUE|1] ORDER BY c.datec DESC
Gdzie parametrem :entity jest zmienna $entity, od biedy samo ID ($entity->getId()). Swoją drogą komentarz może nie mieć autora/użytkownika?
4. Za nazwy ida, idusr, datec ktoś powinien połamać Ci palce. :-)


to pierwsza wersja:

  1. $comments = $em->getRepository('TestArticleBundle:Comment')->findBy(array('view'=>1,'ida'=>$entity->getId()),array('datec'=>'DESC'));


ale nie wiem jak powiązać z tabelą users.

ps. dlaczego "palce ma mi ktoś połamać", skoro to dla mnie wygodne nazewnictwo i jest tylko dla mnie ? smile.gif
Crozin
Zdecyduj się czy tworzysz zapytanie DQL, gdzie sam określasz przy pomocy JOIN-ów co ma być pobrane, czy korzystasz bezpośrednio z EntityManager'a, a to co dołączysz masz zdefiniowane w adnotacjach (parametr fetch). Tutaj niemal na pewno powinieneś skorzystać z DQL-a.

Ad. PS.: Powinno się łamać paluchy za nietrzymanie się względnie utartych konwencji i dobrych praktyk. Ale jak sam powiedziałeś... Twój kod, dla Ciebie. ;-)
nospor
Cytat
Twój kod, dla Ciebie. ;-)
W momencie w ktorym wystawil to na forum, to nie jest juz jego kod i nie kaleczy on tylko siebie. kaleczy wszystkich, ktorzy to czytaja, wiec tak, polamac mu palce aaevil.gif
dopelganger
Cytat(nospor @ 12.11.2015, 15:40:17 ) *
W momencie w ktorym wystawil to na forum, to nie jest juz jego kod i nie kaleczy on tylko siebie. kaleczy wszystkich, ktorzy to czytaja, wiec tak, polamac mu palce aaevil.gif


to ja wieje stąd biggrin.gif
nospor
Za pozno... nasi agenci sa juz pod Twoimi drzwiami arrowheadsmiley.png
dopelganger
no dobra mam coś takiego, ale wywala mi błąd i szlag mnie trafia już :[
prosze o jakąś wskazówke.

Method "firstname" for object "Test\ArticleBundle\Entity\Comment" does not exist in src/Test/ArticleBundle/Resources/views/Default/show.html.


User.php

  1. /**
  2. * @ORM\OneToMany(targetEntity="Test\ArticleBundle\Entity\Comment", mappedBy="user")
  3. */
  4. private $comments;
  5. public function __construct() {
  6. $this->comments = new ArrayCollection();
  7. }

Comment.php

  1. /**
  2. * @ORM\ManyToOne(targetEntity="Test\UserBundle\Entity\User", inversedBy="comments")
  3. * @ORM\JoinColumn(name="idusr", referencedColumnName="id")
  4. */
  5. private $user;

show.html.twig:

  1. {% for c in comments %}
  2. {{ c.firstname }}
  3. {% endfor %}
Crozin
1. Przecież to już z Doctrine'm nie ma powiązania.
2. Method "firstname" for object "Test\ArticleBundle\Entity\Comment" does not exist in src/Test/ArticleBundle/Resources/views/Default/show.html. - co jest w tym niezrozumiałego?
dopelganger
Cytat(Crozin @ 13.11.2015, 15:25:05 ) *
1. Przecież to już z Doctrine'm nie ma powiązania.
2. Method "firstname" for object "Test\ArticleBundle\Entity\Comment" does not exist in src/Test/ArticleBundle/Resources/views/Default/show.html. - co jest w tym niezrozumiałego?


1. tzn?
gdzie, co mam zrobić, jeśli można spytać
nospor
pewnie masz cos takiego
->firstname()

a powinienes miec zapewne
->firstname
dopelganger
Cytat(nospor @ 13.11.2015, 15:44:14 ) *
pewnie masz cos takiego
->firstname()

a powinienes miec zapewne
->firstname


w klasie User.php mam (jeśli o to chodzi):

  1. /**
  2. *
  3. * @param string $firstname
  4. * @return User
  5. */
  6. public function setFirstname($firstname)
  7. {
  8. $this->firstname = $firstname;
  9. return $this;
  10. }
  11.  
  12.  
  13. /**
  14. *
  15. * @return string
  16. */
  17. public function getFirstname()
  18. {
  19. return $this->firstname;
  20. }
nospor
Kurcze, przeciez wyraznie masz napisane o jaka klase chodzi. Czytaj komunikaty bledow :/
dopelganger
Cytat(nospor @ 13.11.2015, 16:03:27 ) *
Kurcze, przeciez wyraznie masz napisane o jaka klase chodzi. Czytaj komunikaty bledow :/


ja wiem o jaką klasę chodzi, tylko nie moge złapać dlaczego taki błąd,, co robie źle
Crozin
1. To znaczy, co ma Doctrine do błędnego używania obiektów w szablonach Twiga?
2. Błąd mówi o klasie Comment, Ty pokazujesz klasę User...
3. Co robisz źle? Nie czytasz komunikatów, które pojawiają Ci się na ekranie.
nospor
Zajrzyj do pliku
show.html
Tam masz odwolanie w stylu
->firstname()

Znajdz je, zobacz na jakim obiekcie to robisz. No bierzesz sie za Symfony to jakies podstawy debugowania moglbys juz miec opanowane
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.