Symfony2 — присоединиться к Native Query

Я пытаюсь установить свое первое соединение с помощью Symfony2 createNativeQuery.

Я сделал первый без соединения, и нет никаких проблем.

Я думаю, что потерял несколько шагов, чтобы следовать моему коду:

$rsm = new ResultSetMapping;

        $rsm
            ->addEntityResult('Art\ArticleBundle\Entity\ArticleData', 'ad')
//          ->addEntityResult('Art\ArticleBundle\Entity\Article', 'a')
//          ->addFieldResult('ad', 'id', 'article_data_id')
            ->addJoinedEntityResult('Art\ArticleBundle\Entity\Article', 'a', 'ad', 'article')
            ->addFieldResult('a', 'date_article', 'dateArticle');

        $query = $this->_em->createNativeQuery(
            'SELECT ad.id AS article_data_id, ad.title, ad.abstract '
            . 'FROM art_article_data ad '
            . 'INNER JOIN art_article ON (ad.article_id = a.id) '
            ,
            $rsm
        );

        return $query->getResult();

Он возвращает следующую ошибку: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'a.id' in 'on clause'").

Почему a.id неизвестно? Он находится внутри объекта и таблицы. Какой шаг я потерял?


person Roberto Rizzi    schedule 10.03.2014    source источник
comment
Не могли бы вы сбросить свой класс сущности для ArticleData?   -  person Javad    schedule 10.03.2014
comment
Я только что разместил объект статьи. :)   -  person Roberto Rizzi    schedule 10.03.2014


Ответы (2)


Как и требовал @Javad, ниже находится сущность Article.

<?php

namespace Art\ArticleBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

use Art\ArticleBundle\Entity\ArticleType;
use Art\ArticleBundle\Entity\ArticleCategory;
use Art\ArticleBundle\Entity\ArticleData;
use Art\ArticleBundle\Entity\ArticleHasBrand;

/**
 * Article
 *
 * @ORM\Entity(repositoryClass="Art\ArticleBundle\Entity\Repository\ArticleRepository")
 * @ORM\Table(name="art_article", options={"collate"="utf8_general_ci", "charset"="utf8"})
 * @ORM\HasLifecycleCallbacks()
 */
class Article
{
    function __construct()
    {
        $this->articles__article_data = new ArrayCollection();
        $this->articles_article_has_brand = new ArrayCollection();
        $this->setDateInsert(new \DateTime);
        $this->setDateEdit(new \DateTime);
        $this->setIsVisible(1);
        $this->setIsMain(0);
        $this->setOrd(0);
    }

    function __toString()
    {
//      $this->dateArticle;
    }

    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="ArticleType", inversedBy="article_types__article")
     * @ORM\JoinColumn(name="article_type_id", referencedColumnName="id", nullable=false)
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $articleType;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="ArticleCategory", inversedBy="article_categories__article")
     * @ORM\JoinColumn(name="article_category_id", referencedColumnName="id", nullable=true)
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $articleCategory;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_article", type="date", nullable=true)
     */
    private $dateArticle;

    /**
     * @var string
     *
     * @ORM\Column(name="url", type="string", length=127, nullable=true)
     */
    private $url;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_insert", type="datetime", nullable=false)
     */
    private $dateInsert;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_edit", type="datetime", nullable=true)
     */
    private $dateEdit;

    /**
     * @var boolean
     *
     * @ORM\Column(name="is_visible", type="boolean", options={"unsigned"=true, "default"=1}, nullable=false)
     */
    private $isVisible;

    /**
     * @var boolean
     *
     * @ORM\Column(name="is_main", type="boolean", options={"unsigned"=true, "default"=0}, nullable=false)
     */
    private $isMain;

    /**
     * @var integer
     *
     * @ORM\Column(name="ord", type="integer", options={"unsigned"=true, "default"=0}, nullable=true)
     */
    private $ord;

    /**
     * @var object
     * 
     * @ORM\OneToMany(targetEntity="ArticleData", mappedBy="article")
     */
    private $articles__article_data;

    /**
     * @var object
     * 
     * @ORM\OneToMany(targetEntity="ArticleHasBrand", mappedBy="article")
     */
    private $articles_article_has_brand;


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

    /**
     * Set dateArticle
     *
     * @param \DateTime $dateArticle
     * @return Article
     */
    public function setDateArticle($dateArticle)
    {
        $this->dateArticle = $dateArticle;

        return $this;
    }

    /**
     * Get dateArticle
     *
     * @return \DateTime 
     */
    public function getDateArticle()
    {
        return $this->dateArticle;
    }

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

    /**
     * Set dateInsert
     *
     * @param string $url
     * @return Article
     */
    public function setUrl($url)
    {
        $this->url = $url;
    }

    /**
     * Set dateInsert
     *
     * @param \DateTime $dateInsert
     * @return Article
     */
    public function setDateInsert($dateInsert)
    {
        $this->dateInsert = $dateInsert;

        return $this;
    }

    /**
     * Get dateInsert
     *
     * @return \DateTime 
     */
    public function getDateInsert()
    {
        return $this->dateInsert;
    }

    /**
     * Set dateEdit
     *
     * @param \DateTime $dateEdit
     * @return Article
     */
    public function setDateEdit($dateEdit)
    {
        $this->dateEdit = $dateEdit;

        return $this;
    }

    /**
     * Get dateEdit
     *
     * @return \DateTime 
     */
    public function getDateEdit()
    {
        return $this->dateEdit;
    }

    /**
     * Set isVisible
     *
     * @param boolean $isVisible
     * @return Article
     */
    public function setIsVisible($isVisible)
    {
        $this->isVisible = $isVisible;

        return $this;
    }

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

    /**
     * Set isMain
     *
     * @param boolean $isMain
     * @return Article
     */
    public function setIsMain($isMain)
    {
        $this->isMain = $isMain;

        return $this;
    }

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

    /**
     * Set ord
     *
     * @param integer $ord
     * @return Article
     */
    public function setOrd($ord)
    {
        $this->ord = $ord;

        return $this;
    }

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

    /**
     * Set articleType
     *
     * @param \Art\ArticleBundle\Entity\ArticleType $articleType
     * @return Article
     */
    public function setArticleType(ArticleType $articleType = null)
    {
        $this->articleType = $articleType;

        return $this;
    }

    /**
     * Get articleType
     *
     * @return \Art\ArticleBundle\Entity\ArticleType 
     */
    public function getArticleType()
    {
        return $this->articleType;
    }

    /**
     * Set articleCategory
     *
     * @param \Art\ArticleBundle\Entity\ArticleCategory $articleCategory
     * @return Article
     */
    public function setArticleCategory(ArticleCategory $articleCategory = null)
    {
        $this->articleCategory = $articleCategory;

        return $this;
    }

    /**
     * Get articleCategory
     *
     * @return \Art\ArticleBundle\Entity\ArticleCategory 
     */
    public function getArticleCategory()
    {
        return $this->articleCategory;
    }

    /**
     * Add articles__article_data
     *
     * @param \Art\ArticleBundle\Entity\ArticleData $articlesArticleData
     * @return Article
     */
    public function addArticlesArticleData(ArticleData $articlesArticleData)
    {
        $this->articles__article_data[] = $articlesArticleData;

        return $this;
    }

    /**
     * Remove articles__article_data
     *
     * @param \Art\ArticleBundle\Entity\ArticleData $articlesArticleData
     */
    public function removeArticlesArticleData(ArticleData $articlesArticleData)
    {
        $this->articles__article_data->removeElement($articlesArticleData);
    }

    /**
     * Get articles__article_data
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getArticlesArticleData()
    {
        return $this->articles__article_data;
    }

    /**
     * Add articles_article_has_brand
     *
     * @param \Art\ArticleBundle\Entity\ArticleHasBrand $articlesArticleHasBrand
     * @return Article
     */
    public function addArticlesArticleHasBrand(ArticleHasBrand $articlesArticleHasBrand)
    {
        $this->articles_article_has_brand[] = $articlesArticleHasBrand;

        return $this;
    }

    /**
     * Remove articles_article_has_brand
     *
     * @param \Art\ArticleBundle\Entity\ArticleHasBrand $articlesArticleHasBrand
     */
    public function removeArticlesArticleHasBrand(ArticleHasBrand $articlesArticleHasBrand)
    {
        $this->articles_article_has_brand->removeElement($articlesArticleHasBrand);
    }

    /**
     * Get articles_article_has_brand
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getArticlesArticleHasBrand()
    {
        return $this->articles_article_has_brand;
    }
}
person Roberto Rizzi    schedule 10.03.2014
comment
вы не должны публиковать это как ответ, а скорее отредактируйте вопрос. - person ArchLinuxTux; 31.08.2017

Ваш запрос должен быть:

$query = $this->_em->createNativeQuery(
        'SELECT ad.id AS article_data_id, ad.title, ad.abstract '
        . 'FROM art_article_data ad '
        . 'INNER JOIN art_article a ON (ad.article_id = a.id) '
        ,
        $rsm
    );

Вы пропустили псевдоним для art_article

person Javad    schedule 10.03.2014
comment
Я пробовал это уже вчера, но я получил эту ошибку: ContextErrorException: Notice: Undefined index: id in /var/www/works/cale.local/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 2434. В чем проблема с индексом? - person Roberto Rizzi; 11.03.2014
comment
Теперь это другое, вам нужно добавить id в свой выбор. Проверьте это [stackoverflow.com/questions/14016121/ - person Javad; 11.03.2014