2015-09-25 5 views
1

У меня проблема с запросом в доктрине, я начал использовать Symfony недавно для продолжения старого проекта в Symfony, и теперь я хочу узнать его. я начинаю объяснять из БД и я пишу только те поля, которые интересуют меня:Учреждение доктрины Symfony Query

  • пользователя (идентификатор, имя, фамилия, Phat)

  • user_reference (идентификатор, id_user [FOREIGN KEY ID FROM пользователь ], id_user_referenced [ИНОСТРАННОЙ идентификатор ключа ОТ пользователя])

Это запрос:

 $id_user = $user->getId(); 
     $query = $em->createQueryBuilder() 
    ->select('ur','uu') 
    ->from('DtEcBundle:UserReferences', 'ur') 
    ->innerJoin("ur.id_user","uu") 
    ->where("ur.id_user = :id_user") 
    ->setParameter("id_user",$id_user) 
      ->getQuery(); 
      $userpyramid = $query->getResult(); 
я печатаю в моем файле веточку id_user_referenced, но я бы печатать тоже «имя, фамилию и путь» из таблицы USER

Для печати id_user_referenced в UserReferences Entity Существует этот код:

/** 
* Set id_user_referenced 
* 
* @param \Dt\EcBundle\Entity\User $idUserReferenced 
* @return UserReferences 
*/ 
public function setIdUserReferenced(\Dt\EcBundle\Entity\User $idUserReferenced = null) { 
    $this->id_user_referenced = $idUserReferenced; 

    return $this; 
} 

/** 
* Get id_user_referenced 
* 
* @return \Dt\EcBundle\Entity\User 
*/ 
public function getIdUserReferenced() { 
    return $this->id_user_referenced; 
} 

Transform ряд как идентификатор строки в объект пользователя с:

public function __toString(){ 
    return strval($this->id); 
} 

Теперь, если я добавить в мой запрос в это выбрать:

->select('ur','uu.path') 

Symfony отправить мне сообщение об ошибке:

Key "idUserReferenced" for array with keys "0, path" does not exist in DtEcBundle:Profilo:digitalpr-profile.html.twig at line 40

Почему ?? Как я могу это решить?

UserReferences.php

namespace Dt\EcBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* UserReferences 
* 
* @ORM\Table(name="user_references" ,uniqueConstraints=   {@ORM\UniqueConstraint(name="recension_unique", columns={"id_user",  "id_user_referenced"})}) 
* @ORM\Entity(repositoryClass="Dt\EcBundle\Entity\UserReferencesRepository") 
*/ class UserReferences { 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* 
* @var Dt\EcBundle\Entity\User 
* @ORM\ManyToOne(targetEntity="Dt\EcBundle\Entity\User",  inversedBy="references") 
* @ORM\JoinColumn(name="id_user", referencedColumnName="id") 
*/ 
    private $id_user; 

/** 
* @ORM\ManyToOne(targetEntity="Dt\EcBundle\Entity\User") 
* @ORM\JoinColumn(name="id_user_referenced", referencedColumnName="id") 
* */ 
private $id_user_referenced; 

/** 
* 
* @var string 
* @ORM\Column(name="reference", type="text", nullable=false,unique=false); 
*/ 
private $reference; 

/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() { 
    return $this->id; 
} 

/** 
* Set reference 
* 
* @param string $reference 
* @return UserReferences 
*/ 
public function setReference($reference) { 
    $this->reference = $reference; 

    return $this; 
} 

/** 
* Get reference 
* 
* @return string 
*/ 
public function getReference() { 
    return $this->reference; 
} 

/** 
* Set id_user 
* 
* @param \Dt\EcBundle\Entity\User $idUser 
* @return UserReferences 
*/ 
public function setIdUser(\Dt\EcBundle\Entity\User $idUser = null) { 
    $this->id_user = $idUser; 

    return $this; 
} 

/** 
* Get id_user 
* 
* @return \Dt\EcBundle\Entity\User 
*/ 
public function getIdUser() { 
    return $this->id_user; 
} 

/** 
* Set id_user_referenced 
* 
* @param \Dt\EcBundle\Entity\User $idUserReferenced 
* @return UserReferences 
*/ 
public function setIdUserReferenced(\Dt\EcBundle\Entity\User $idUserReferenced = null) { 
    $this->id_user_referenced = $idUserReferenced; 

    return $this; 
} 

/** 
* Get id_user_referenced 
* 
* @return \Dt\EcBundle\Entity\User 
*/ 
public function getIdUserReferenced() { 
    return $this->id_user_referenced; 
} 
} 

User.php

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255, unique=false, nullable=false) 
* @Assert\NotBlank(message="user.name.not.blank") 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.name.not.min", 
*   maxMessage="user.name.not.max") 
*/ 
protected $name; 

/** 
* @var string 
* 
* @ORM\Column(name="surname", type="string", length=255, unique=false, nullable=false) 
* @Assert\NotBlank(message="user.surname.not.blank") 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.surname.not.min", 
*   maxMessage="user.surname.not.max") 
*/ 
protected $surname; 

/** 
* @var \DateTime 
* @ORM\Column(name="borndate", type="datetime",unique=false,nullable=false) 
*/ 
protected $borndate; 

/** 
* 
* @var string 
* @ORM\Column(name="tel", type="string",length=50, unique=true,nullable=true) 
* @Assert\Regex("/[0-9]/") 
*/ 
protected $tel; 

/** 
* 
* @var string 
* @ORM\Column(name="city", type="string",length=255,unique=false,nullable=true) 
* @Assert\NotBlank(message="user.expert.city.not.blank",groups={"Expert"}) 
* @Assert\NotBlank(message="user.expert.city.not.blank",groups={"ExpertProfile"}) 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.expert.city.not.min", 
*   maxMessage="user.expert.city.not.max", groups={"Expert"}) 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.expert.city.not.min", 
*   maxMessage="user.expert.city.not.max", groups={"ExpertProfile"}) 
*/ 
protected $city; 

/** 
* 
* @var string 
* @ORM\Column(name="street", type="string",length=255,unique=false,nullable=true) 
* @Assert\NotBlank(message="user.expert.street.not.blank",groups={"Expert"}) 
* @Assert\NotBlank(message="user.expert.street.not.blank",groups={"ExpertProfile"}) 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.expert.street.not.min", 
*   maxMessage="user.expert.street.not.max", groups={"Expert"}) 
* @Assert\Length(
*   min=2, 
*   max=150, 
*   minMessage="user.expert.street.not.min", 
*   maxMessage="user.expert.street.not.max", groups={"ExpertProfile"}) 
*/ 
protected $street; 

/** 
* 
* @var type 
* 
* @Assert\File(
*  maxSize = "1024k", 
*  mimeTypes = {"image/gif","image/jpeg","image/pjpeg","image/png"}, 
*  mimeTypesMessage = "user.image.mimetypes", 
*  maxSizeMessage = "user.image.maxsize" 
*) 
* @Assert\NotBlank(message="user.expert.mandatory.photo",groups={"Expert"}) 
* 
*/ 
protected $photo; 

/** 
* @ORM\Column(name="photo_path",type="string", length=255, nullable=true,unique=true) 
*/ 
protected $path; 
/** 
* Membri per la gestione dei file 
* 
*/ 
+0

Можете ли вы показать свою веточку? Я имею в виду ** DtEcBundle: Profilo: digitalpr-profile.html.twig в строке 40 ** –

+0

Можете ли вы показать сопоставления этих объектов DtEcBundle: UserReferences и DtEcBundle: User? –

+1

По крайней мере одна возможная проблема, которую я вижу, - это innerJoin («ur.id_user», «uu»). Вероятно, это должно быть innerJoin («ur.user», «uu») - вы указали имя свойства объекта, а не поле в базе данных. Но мы должны видеть отображения, чтобы быть уверенными –

ответ

0

Я стараюсь в этом режиме, но не хорошо

$id_user = $user->getId(); 
     $query = $em->createQueryBuilder() 
    ->select('ur','uu') 
    ->from('DtEcBundle:UserReferences', 'ur') 
    ->innerJoin("ur.id_user","uu") 
    ->where("ur.id_user = :id_user") 
    ->setParameter("id_user",$id_user) 
      ->getQuery(); 
      $userpyramid = $query->getResult(); 


    $form = $this->get('form.factory')->createNamedBuilder('form', 'form') 
     ->setMethod('POST') 
     ->setAction($this->generateUrl('profilo_secondlevel')) 
     ->add('save', 'submit', ['label' => 'Prova']) 
     ->getForm();*/ 


     $result->getIdUserReferenced()->getPath(); 

    return $this->render('DtEcBundle:Profilo:index.html.twig', array(
     'user'    => $user, 
     'tags'    => $tags, 
     'followers'   =>$followers, 
     'expert'   =>$expert, 
     'user_expert'  =>$user_expert, 
     'well_cat'   =>$well_cat, 
     'user_notification' => $user_notifications, 
     "udputenti" => $udputenti, 
     "userpyramid" => $userpyramid, 
     "result"=> $result 
     //'form'=>$form->createView() 
    ));` 
+0

Я думаю, что $ userpyramid будет иметь массив UserReference. Сделайте var_dump ($ userpyramid), и вы увидите иерархию объектов в результате –

+0

Да, если я печатаю {{dump (userpyramid)}} в моем файле twig, я получаю этот 'array: 3 [▼ « id »= > 4 "ссылка" => "Prova" "id_user" => массив: 33 [▶] ] ' но не id_user_referenced .. Я получаю id_user_referenced только с IdUserReferenced ... –

+0

@Dmitry Малышенко –

1

Проблема заключается в том, что доктрина гидратов ваш результат в режиме Array Hydration, в то время как вы ожидаете Object Hydraion.

В первом случае вы запрашиваете 2 связанных объекта, а учение может связывать их. Во втором вы запрашиваете объект и скалярное значение, а доктрина не может их связывать, поэтому он возвращает их в двух отдельных полях массива результатов.

Таким образом, результат, полученный вами из $ query-> getResult() в случае select('ur','uu.path'), не является массивом объектов пользователя, а массивом из двух полей - $ result [0], где вы все нашли объекты User , и $ result ['path'] для uu.path - потому что uu.path является скалярным значением, а не объектом.

Так что вам нужно сделать select('ur','uu') и отправить свой результат как $result->getIdUserReferenced()->getPath().

Или (если вы хотите сэкономить ресурсы, но я не думаю, что это того стоит) сделайте select('ur','uu.path'), а затем сделайте var_dump результата. И вы увидите, как обратиться к тому, что вам нужно.

+0

Спасибо за ответ, но я не понимаю, где я положил '$ result-> getIdUserReferenced() -> getPath() 'в моем контроллере? После запроса? –

Смежные вопросы