私の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;
}
}
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();