在摄影大赛中,有一个具有“imageId”字段的投票实体。
我想获得一个查询,其中包含投票的 ID 和投票所携带的 Id 图像的文件名。 该实体如下所示:
class Vote
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="integer", name="image_id")
* @var integer $imageId
* @ORM\ManyToOne(targetEntity="Image")
* @ORM\JoinColumn(name="image_id", referencedColumnName="id")
*/
protected $imageId;
/**
* @ORM\Column(type="datetime", name="date")
*/
protected $date;
它链接到的图像如下:
class Image {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @ORM\Column(type="string", length=255, name="file_name")
* @var string $fileName
*/
protected $fileName;
现在我尝试使用此查询生成器获取结果:
$votes = $qb -> select("v.id, i.fileName, v.date")
->from("AppBundle:Vote", "v")
->join("AppBundle:Image", "i")
->orderBy("v.id", "DESC")
->getQuery();
在此配置中使用它会出现错误:
Expected Literal, got 'BY'
但是删除 orderBy 后我得到了这个结果
Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got end of string.
我知道该错误与我没有在连接内使用 WITH
参数有关,但希望它能 100% 良好地工作,并使其完全通过 Doctrine 关系.
问题可能出在哪里以及如何解决?
最佳答案
我认为这是因为在您的实体中,您的 imageId 字段在 Doctrine 中定义了两次:
@ORM\Column(type="integer", name="image_id")
和
@ORM\JoinColumn(name="image_id", referencedColumnName="id")
您必须删除第一个(@ORM\Column),因为它是连接关系。
另外,您必须这样定义它:
/**
* @var Image
*
* @ORM\ManyToOne(targetEntity="Image")
* @ORM\JoinColumn(name="image_id")
*/
protected $image;
您不需要更多。
在你的 VoteRepo 中:
$qb = $qb = $this->createQueryBuilder('v')
->select('v.id, i.fileName, v.date')
->join('v.image', 'i')
->orderBy('v.id', 'DESC');
关于php - 使用联接时 Doctrine 查询生成器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42399511/