尝试使用以下代码连接我的 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
时可以根据关联而不是实际列名称进行联接。