【问题标题】:Issue when trying to use doctrine queryBuilder尝试使用学说 queryBuilder 时的问题
【发布时间】:2016-08-09 08:44:38
【问题描述】:

我有两个实体 CategorieChampCatManyToMany 关系,我想通过使用学说 QueryBuilder 获取具有相关 ChampCat 的类别列表,所以我使用了这个查询:

class CategorieRepository extends \Doctrine\ORM\EntityRepository
{
    public function myFindCategories(array $tab){

        $em = $this->getEntityManager();

        $query = $em->select(array('cat', 'ch'))
                    ->from('AnnonceBundle\Entity\Categorie', 'cat')
                    ->join('cat.champsCat', 'ch')
                    ->where('cat.id In (:tabOfIds)')
                    ->setParameter('tabOfIds', array_values($tab))
                    ->getQuery();

        return $query->getResult();

    }


}

在这里你可以看到类别实体:

<?php

namespace AnnonceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Categorie
 *
 * @ORM\Table(name="categorie")
 * @ORM\Entity(repositoryClass="AnnonceBundle\Repository\CategorieRepository")
 */
class Categorie implements \JsonSerializable
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="refCat", type="string", length=100)
     */
    private $refCat;

    /**
     * @var string
     *
     * @ORM\Column(name="libelleCat", type="string", length=50)
     */
    private $libelleCat;

    /**
     * @ORM\ManyToMany(targetEntity="AnnonceBundle\Entity\ChampCat",cascade={"persist"})
     */
    private $champsCat;

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

    /**
     * Set refCat
     *
     * @param string $refCat
     *
     * @return Categorie
     */
    public function setRefCat($refCat)
    {
        $this->refCat = $refCat;

        return $this;
    }

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

    /**
     * Set libelleCat
     *
     * @param string $libelleCat
     *
     * @return Categorie
     */
    public function setLibelleCat($libelleCat)
    {
        $this->libelleCat = $libelleCat;

        return $this;
    }

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

    /**
     * Set champsCat
     *
     * @param \AnnonceBundle\Entity\ChampCat $champsCat
     *
     * @return Categorie
     */
    public function setChampsCat(\AnnonceBundle\Entity\ChampCat $champsCat = null)
    {
        $this->champsCat = $champsCat;

        return $this;
    }

    /**
     * Get champsCat
     *
     * @return \AnnonceBundle\Entity\ChampCat
     */
    public function getChampsCat()
    {
        return $this->champsCat;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->champsCat = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add champsCat
     *
     * @param \AnnonceBundle\Entity\ChampCat $champsCat
     *
     * @return Categorie
     */
    public function addChampsCat(\AnnonceBundle\Entity\ChampCat $champsCat)
    {
        $this->champsCat[] = $champsCat;

        return $this;
    }

    /**
     * Remove champsCat
     *
     * @param \AnnonceBundle\Entity\ChampCat $champsCat
     */
    public function removeChampsCat(\AnnonceBundle\Entity\ChampCat $champsCat)
    {
        $this->champsCat->removeElement($champsCat);
    }

    function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

这是 ChamCat 实体:

<?php

namespace AnnonceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * ChampCat
 *
 * @ORM\Table(name="champ_cat")
 * @ORM\Entity(repositoryClass="AnnonceBundle\Repository\ChampCatRepository")
 */
class ChampCat implements \JsonSerializable
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     *@var string
     *
     * @ORM\Column(name="refCh", type="string")
     */
    private $refCh;



    /**
     * @var string
     *
     * @ORM\Column(name="nom_ch", type="string", length=255)
     */
    private $nomCh;

    /**
     * @var bool
     *
     * @ORM\Column(name="app_ch", type="boolean")
     */
    private $appCh;

    /**
     * @var string
     *
     * @ORM\Column(name="format_ch", type="string", length=255)
     */
    private $formatCh;


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

    /**
     * Set refCh
     *
     * @param integer $refCh
     * @return ChampCat
     */
    public function setRefCh($refCh)
    {
        $this->refCh = $refCh;

        return $this;
    }

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

    /**
     * Set nomCh
     *
     * @param string $nomCh
     * @return ChampCat
     */
    public function setNomCh($nomCh)
    {
        $this->nomCh = $nomCh;

        return $this;
    }

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

    /**
     * Set appCh
     *
     * @param boolean $appCh
     * @return ChampCat
     */
    public function setAppCh($appCh)
    {
        $this->appCh = $appCh;

        return $this;
    }

    /**
     * Get appCh
     *
     * @return boolean 
     */
    public function getAppCh()
    {
        return $this->appCh;
    }

    /**
     * Set formatCh
     *
     * @param string $formatCh
     * @return ChampCat
     */
    public function setFormatCh($formatCh)
    {
        $this->formatCh = $formatCh;

        return $this;
    }

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

    function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

不幸的是,这个查询不起作用,所以我错过了什么?

【问题讨论】:

  • 您所说的“它不起作用”是什么意思,它有错误,或者结果是错误的?
  • 我正在通过 ajax 函数使用此查询,结果为“500(内部服务器错误)”,这意味着查询中存在问题。
  • 是的,您可以给我们异常消息吗?它在您的项目应用程序/日志中
  • 哦抱歉不知道这个文件:)。这是例外:[2016-08-09 11:14:10] request.CRITICAL:未捕获的 PHP 异常 RuntimeException:“在调用 getRootAlias() 之前未设置别名。”在 /var/www/sbc_project/vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php 第 423 行 {"exception":"[object] (RuntimeException(code: 0): 在调用 getRootAlias( ). 在 /var/www/sbc_project/vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php:423)"} []

标签: php symfony doctrine-orm doctrine


【解决方案1】:

它是否使用这种语法?

public function myFindCategories(array $tab){

    if(count($tab) == 0) return []; //or IN() will bug with an empty array


    $query = $this->createQueryBuilder('cat')
                ->addSelect('ch')
                ->innerJoin('cat.champsCat', 'ch')
                ->where('cat.id in (:tabOfIds)')
                ->setParameter('tabOfIds', $tab)
                ->getQuery();

    return $query->getResult();

}

【讨论】:

  • 不抱歉,这不起作用。问题不在于 $tab 变量,因为测试它永远不会为空,但我认为查询语法有问题但我不确定。
  • 如果你在你的存储库类中,你尝试像我编辑的答案一样吗?(没有 $em 调用?)
  • 谢谢它正在工作,但我在类别列表中找不到 ChampCat 实体!这是结果 [{"id":2,"refCat":"002","libelleCat":"cat2","champsCat":{}}],chamsCat 为空!
  • 可能是因为延迟加载。 $cat-&gt;getChampsCat() 有什么用?
  • 我想过,但实际上我并没有将对象直接发送到树枝(所以我可以使用延迟加载),但我使用的是 ajax,所以结果将是 ajax,类似于:[ {"id":2,"refCat":"002","libelleCat":"cat2","champsCat":{}}]。所以当我遍历它时,延迟加载将不起作用。
猜你喜欢
  • 2016-08-25
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
相关资源
最近更新 更多