使用联接

时间:2017-02-22 18:30:14

标签: php mysql doctrine-orm doctrine symfony

在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关系。

可能是问题,我该如何解决?

1 个答案:

答案 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');