web-dev-qa-db-ja.com

dqlクエリエラークラスが定義されていません

私のSQLクエリをdqlに変換しようとすると、何か問題が発生しているようです。

このような基本的な結合が必要です。

SELECT a.id, a.title, u.name FROM articles JOIN users ON a.author_id = u.id

試した

SELECT a.id, a.title, u.name FROM Article a JOIN User u WITH a.author_id = u.id

エラーが発生する

[Semantical Error] line 0, col 34 near 'Article a JOIN': Error: Class 'Article' is not defined.

どのように定義すればよいですか?正しい解決策を教えていただけますか?

編集:

記事エンティティ

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="articles")
 */
class Article
{
    /**
     * @var integer $id
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $title;


    /**
     * @ORM\Column(type="integer", name="author_id")
     */
    protected $authorId;

    /**
     * @ORM\Column(type="datetime", name="creation_date")
     */
    protected $creationDate;

    /**
     * @ORM\Column(type="string", name="short_content")
     */
    protected $shortContent;

    /**
     * @ORM\Column(type="string")
     */
    protected $content;

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

    public function getTitle()
    {
        return $this->title;
    }

    public function getAuthorId()
    {
        return $this->authorId;
    }

    public function getCreationDate()
    {
        return $this->creationDate;
    }

    public function getShortContent()
    {
        return $this->shortContent;
    }

    public function getContent()
    {
        return $this->content;
    }
}

ユーザーエンティティ

<?php
namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="bigint")
     */
    protected $phone;

    /**
     * @ORM\Column(type="string")
     */
    protected $gender;

    /**
     * @ORM\Column(type="string")
     */
    protected $about;

    public function getPhone()
    {
        return $this->phone;
    }

    public function getGender()
    {
        return $this->gender;
    }

    public function getAbout()
    {
        return $this->about;
    }
}
9
Tigran Muradyan

DQL内のエンティティを名前空間で参照します。つまり、AppBundle:ArticleおよびAppBundle:User、それでエラーがなくなるはずです。

エンティティでauthorIdの代わりに アソシエーションマッピングold docs )を使用すると、このようにDoctrineが読み込みを処理します著者:

/** 
 * @ORM\ManyToOne(targetEntity="User") 
 * @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
 **/ 
private $author;

public function getAuthor() {
    return $this->author;
}

public function setAuthor($author) {
   $this->author = $author;
}

クエリは次のようになります。

SELECT a FROM AppBundle:Article a ORDER BY a.creationDate DESC

記事を読み込んだら、著者に簡単にアクセスできます。

...
$author = $article->getAuthor();
8
Genti Saliu