Symfony2 + Doctrine OneToMany JOIN failing


Symfony2 + Doctrine OneToMany JOIN failing

尝试使用以下代码连接我的 2 个表:

    $query = $em->createQuery('SELECT a, c FROM AppBundle:Auctions a JOIN a.catalog c');        
    $auctions = $query->getResult();

并收到错误:[语义错误] 第 0 行,第 53 行靠近"c":错误:类 AppBundle''实体''拍卖没有名为目录的关联

我的表定义如下:

拍卖.php:

namespace AppBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Auctions
 *
 * @ORM'Table(name="auctions")
 * @ORM'Entity
 */
class Auctions
{
/**
 * @var integer
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="IDENTITY")
 */
private $id;
/**
 * @var 'Doctrine'Common'Collections'ArrayCollection
 * 
 * @ORM'OneToMany(targetEntity="AppBundle'Entity'Catalogs", mappedBy="auction")
 */
private $catalog;
}

和目录.php:

<?php
namespace AppBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Catalogs
 *
 * @ORM'Table(name="catalogs", indexes={@ORM'Index(name="catalogs_FI_1", columns={"treasurer_info_id"}), @ORM'Index(name="catalogs_FI_2", columns={"auction_id"}), @ORM'Index(name="unique_stripped_name", columns={"stripped_name"})})
 * @ORM'Entity
 */
class Catalogs
{
    /**
 * @var integer
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="IDENTITY")
 */
private $id;
/**
 * @var 'AppBundle'Entity'Auctions
 * 
 * @ORM'ManyToOne(targetEntity="AppBundle'Entity'Auctions", inversedBy="catalog")
 * @ORM'JoinColumns({
 *   @ORM'JoinColumn(name="auction_id", referencedColumnName="id")
 * })
 */
private $auction;             

不太确定我在这里做错了什么,似乎 OneToMany 的所有教义示例都是这样的?任何帮助,不胜感激。

更新

:更新了正在使用的架构文件和查询。

您不希望主键上的OneToMany关联。 您想要的是Auctions实体中与Catalogs相关的另一个变量:

/**
 * @var 'Doctrine'Common'Collections'ArrayCollection
 *
 * @ORM'OneToMany(targetEntity="Catalogs", mappedBy="auction")
 */
private $catalogs;

然后更新Catalogs实体:

/**
 * @var 'AppBundle'Entity'Auctions
 * 
 * @ORM'ManyToOne(targetEntity="AppBundle'Entity'Auctions", inversedBy="catalogs")
 * @ORM'JoinColumns({
 *   @ORM'JoinColumn(name="auction_id", referencedColumnName="id")
 * })
 */
private $auction;

然后,您的联接将如下所示:

$query = $em->createQuery('SELECT a, c FROM AppBundle:Auctions a JOIN a.catalogs c');
$auctions = $query->getResult();

在处理 Doctrine 时,您要记住的是,您正在根据实体之间的相互关系来考虑它们,而不是它们在 SQL 查询中的关联方式。 您正在定义实体内的id映射,以便在编写DQL时可以根据关联而不是实际列名称进行联接。