Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Doctrine2 - problem z join
Forum PHP.pl > Forum > PHP > Object-oriented programming
bartos12
Witam,
od niedawna uczę się symfony2 i natrafiłem na problem przy próbie stworzenia zapytania z join w doctrine2. Wydaje mi się że zrobiłem wszystko tak jak w dokumentacji, ale najprawdopodobniej tak nie jest ;/.

Tutaj jest model User.php
  1. <?php
  2.  
  3. namespace Acme\FootballBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8.  * Acme\FootballBundle\Entity\User
  9.  *
  10.  * @ORM\Table(name="User")
  11.  * @ORM\Entity(repositoryClass="Acme\FootballBundle\Repository\UserRepository")
  12.  */
  13. class User
  14. {
  15. /**
  16.   * @var integer $userId
  17.   *
  18.   * @ORM\Column(name="user_id", type="integer", nullable=false)
  19.   * @ORM\Id
  20.   * @ORM\GeneratedValue(strategy="IDENTITY")
  21.   */
  22. private $userId;
  23.  
  24. /**
  25.   * @var string $userName
  26.   *
  27.   * @ORM\Column(name="user_name", type="string", length=50, nullable=false)
  28.   */
  29. private $userName;
  30.  
  31. /**
  32.   * @var string $userLevel
  33.   *
  34.   * @ORM\Column(name="user_level", type="string", length=20, nullable=false)
  35.   */
  36. private $userLevel;
  37.  
  38. /**
  39.   * @var string $userPass
  40.   *
  41.   * @ORM\Column(name="user_pass", type="string", length=32, nullable=false)
  42.   */
  43. private $userPass;
  44.  
  45. /**
  46.   * @ORM\OneToMany(targetEntity="Advert", mappedBy="User")
  47.   */
  48. protected $Advert;
  49.  
  50. /**
  51.   * Get userId
  52.   *
  53.   * @return integer
  54.   */
  55. public function getUserId()
  56. {
  57. return $this->userId;
  58. }
  59.  
  60.  
  61.  
  62.  
  63. public function __construct()
  64. {
  65. $this->Advert = new \Doctrine\Common\Collections\ArrayCollection();
  66. }
  67.  
  68. }


Oraz advert

  1. <?php
  2.  
  3. namespace Acme\FootballBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8.  * Acme\FootballBundle\Entity\Advert
  9.  *
  10.  * @ORM\Table(name="Advert")
  11.  * @ORM\Entity(repositoryClass="Acme\FootballBundle\Repository\AdvertRepository")
  12.  */
  13. class Advert
  14. {
  15. /**
  16.   * @var integer $advertId
  17.   *
  18.   * @ORM\Column(name="advert_id", type="integer", nullable=false)
  19.   * @ORM\Id
  20.   * @ORM\GeneratedValue(strategy="IDENTITY")
  21.   */
  22. private $advertId;
  23.  
  24. /**
  25.   * @var string $advertTitle
  26.   *
  27.   * @ORM\Column(name="advert_title", type="string", length=50, nullable=false)
  28.   */
  29. private $advertTitle;
  30.  
  31. /**
  32.   * @var text $advertContent
  33.   *
  34.   * @ORM\Column(name="advert_content", type="text", nullable=false)
  35.   */
  36. private $advertContent;
  37.  
  38. /**
  39.   * @var datetime $advertCreatedDate
  40.   *
  41.   * @ORM\Column(name="advert_created_date", type="datetime", nullable=false)
  42.   */
  43. private $advertCreatedDate;
  44.  
  45. /**
  46.   * @ORM\ManyToOne(targetEntity="User", inversedBy="Advert")
  47.   * @ORM\JoinColumn(name="userId", referencedColumnName="user")
  48.   */
  49.  
  50. private $user;
  51.  
  52. }


Metody set oraz get pominąłem.

Moje zapytanie stworzone w UserRepository

  1. $this->getEntityManager()
  2. ->createQuery('SELECT p FROM AcmeFootballBundle:User p JOIN p.Advert a WHERE p.userId = a.user')
  3. ->getResult();



Komunikat :

  1. Notice: Undefined index: User in .../vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php line 751


Tabela user ma klucz głowny user.user.id, natomiast tabela advert ma klucz obcy advert.user_id. Mniemam że coś źle zrobiłem w adnotacji przy relacjach ale nie mogę doszukać się błędu.
-=Peter=-
  1. //klasa User
  2.  
  3. /**
  4. * @ORM\OneToMany(targetEntity="Advert", mappedBy="User")
  5. */
  6. protected $Advert;
  7.  
  8. //Klasa Advert
  9.  
  10. /**
  11. * @ORM\ManyToOne(targetEntity="User", inversedBy="Advert")
  12. * @ORM\JoinColumn(name="userId", referencedColumnName="user")
  13. */
  14. private $user;


W klasie User jako mappedBy dla relacji Advert masz "User", a w klasie Advert składowa nazywa się "user" (z małej litery), zapewne z tego powodu jest ten notice.

Poza tym warunek "where" w Twoim zapytaniu jest zbędny. Doctrine dodaje tej warunek automatycznie do klauzuli "ON" odpowiedniego joina. Masz błędne referencedColumnName nad składową Advert::$user, powinno być klucz główny klasy User, czyli "userId".
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.