在photocontest中有一个投票实体,其中包含“imageId”字段。
我想获得一个查询,其中包含投票ID和投票ID所带图像的fileName。 该实体看起来像这样:
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();
在此配置中使用它会给我一个错误说:
预期文字,得到'BY'
但删除订单后我得到了这个结果
错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_WITH,得到了字符串的结尾。
我知道错误链接到这样一个事实,即我没有在联接中使用WITH
参数,但希望这可以100%正常工作并让它完全通过docrine关系。
可能是问题,我该如何解决?
答案 0 :(得分:0)
我认为这是因为在你的实体中,你的imageId字段在学说中被定义了两次:
@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');