【问题标题】:Symfony Query doctrine entitySymfony Query 学说实体
【发布时间】:2015-09-25 11:04:32
【问题描述】:

我最近开始使用 Symfony 以继续使用 Symfony 中的旧项目,现在我想学习它。 我从 db 开始解释,我只写我感兴趣的字段:

  • 用户(id,name,surname,phat)

  • user_reference(id,id_user[FOREIGN KEY id FROM user],id_user_referenced[FOREIGN KEY id FROM user])

这是查询:

     $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 表中打印“姓名、姓氏和路径”

对于实体 UserReferences 中的打印 id_user_referenced,有以下代码:

    /**
 * 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;
}

在实体用户中将类似 id 的数字转换为字符串:

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

现在,如果我在选择中添加我的查询:

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

Symfony 向我发送错误消息:

键为“0,路径”的数组的键“idUserReferenced”不存在于 DtEcBundle:Profilo:digitalpr-profile.html.twig 在第 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
 * 
 */

【问题讨论】:

  • 你能展示你的树枝吗?我的意思是第 40 行的 DtEcBundle:Profilo:digitalpr-profile.html.twig
  • 你能显示这些对象 DtEcBundle:UserReferences 和 DtEcBundle:User 的映射吗?
  • 我看到的至少一个可能的问题是这个 innerJoin("ur.id_user","uu")。它可能应该是 innerJoin("ur.user","uu") - 您设置了对象属性的名称,而不是数据库中的字段。但是我们应该看到映射来确定
  • @Dmitry Malyshenko 我用实体更新帖子
  • @Dmitry Malyshenko 又有一部分代码了

标签: php mysql symfony doctrine-orm


【解决方案1】:

问题在于,学说在Array Hydration 模式下为您的结果提供了水合物,而您期望Object Hydraion

在第一种情况下,您要求 2 个相关对象,并且学说可以将它们链接起来。在第二个中,您要求一个对象和一个标量值,而学说无法链接它们,因此它在结果数组的两个单独字段中返回它们。

因此,在select('ur','uu.path') 的情况下,您从 $query->getResult() 获得的结果不是用户对象的数组,而是 2 个字段的数组 - 您在 $result[0] 中都找到了用户对象和 $result['path'] 用于 uu.path - 因为 uu.path 是标量值而不是对象。

所以你需要创建select('ur','uu') 并将你的结果写成$result->getIdUserReferenced()->getPath()

或者(如果你想节省一些资源,但我认为不值得)制作select('ur','uu.path'),然后制作结果的var_dump。您将看到如何满足您的需求。

【讨论】:

  • 感谢您的回答,但我不明白,我将$result->getIdUserReferenced()->getPath() 放在我的控制器中的哪个位置?查询后??
【解决方案2】:

我在这个模式下试了,但是不好

  $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()
    ));`

【讨论】:

  • 我认为 $userpyramid 会有一个 UserReference 数组。制作 var_dump($userpyramid) 你会在结果中看到对象的层次结构
  • 是的,如果我在我的 twig 文件中打印 {{dump(userpyramid)}} 我会得到这个 array:3 [▼ "id" => 4 "reference" => "prova" "id_user" => array:33 [▶] ] 但没有 id_user_referenced .. 我只使用 IdUserReferenced 得到 id_user_referenced ...跨度>
  • 所以 $userpuramid 是一个 UserReference 数组。所以在树枝中必须工作 {{userpyramid[0].id_user_referenced.path}}
  • 或 {% for reference in userpyramid %} {{reference.path}} {% endfor %}
  • 给我变量 $result 的错误.. @Dmitry Malyshenko
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2012-06-27
  • 2021-10-06
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多