2013-12-17 39 views
0

我有关于学说2中的关联问题 我有两个看起来相同的关联。一个工作正常,第二个以奇怪的方式工作。我稍后再解释一下。学说 - 其中一个协会不能正常工作

这里是我的主要实体 - 产品:

** 
* Product 
* 
* @ORM\Table(name="product", indexes={ 
*  @ORM\Index(name="category_index", columns={"category_id"}), 
*  @ORM\Index(name="partner_index", columns={"partner_id"}) 
* }) 
* @ORM\Entity 
*/ 
class Product 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255, nullable=false) 
    */ 
    private $name; 

    /** 
    * @var Category 
    * 
    * @ORM\ManyToOne(targetEntity="Category") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $categoryId; 

    /** 
    * @var Partner 
    * 
    * @ORM\ManyToOne(targetEntity="Partner") 
    * @ORM\JoinColumn(name="partner_id", referencedColumnName="id") 
    */ 

    private $partnerId; 
} 

分类实体:

/** 
* Category 
* 
* @ORM\Table(name="category") 
* @ORM\Entity 
*/ 
class Category 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="category_name", type="string", length=100, nullable=false) 
    */ 
    private $categoryName; 
} 

合伙实体:

/** 
* Partner 
* 
* @ORM\Table(name="partner") 
* @ORM\Entity 
*/ 
class Partner 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=150, nullable=false) 
    */ 
    private $name; 
} 

正如你可以看到我有两个相同的关联:
产品#categoryId
产品#PARTNERID

第一单的categoryId作品,因为它应该,但第二单PARTNERID并不:

我注意到的第一件事是,这种理论创建代理类与合作伙伴的实体, 而实体类不需要代理类工作,所以 这一个不正常工作。我刚开始与主义,所以我可能是 错误。

我在合作伙伴表中有4条记录。当我尝试手动修改产品 纪录,在PARTNER_ID场我不能设置1-4,我可以设置 是这样的:

(empty) 
1 - 1 
2 - 2 
3 - 3 
4 - 4 
(empty) 
1 - 1 
2 - 2 
3 - 3 
4 - 4 

我第一次看到这样的事情。

而最后一件事,我注意到:

$query = $em->createQuery(' 
    SELECT pp.name, p.id 
    FROM Application\Entity\Product AS p 
    LEFT JOIN Application\Entity\Partner AS pp WITH p.partner_id = pp.id GROUP by p.partner_id 
'); 
$items = $query->getResult(); 

显示我的错误:

Doctrine\ORM\Query\QueryException: [Semantical Error] line 0, col 148 near 'partner_id =': Error: Class Application\Entity\Product has no field or association named partner_id in 

感谢您的帮助和提示。

编辑
所以,问题是。为什么Doctrine为Partner Entity创建代理类,但不是为Category创建代理类?

回答

0

据我所知,Doctrine只会在使用它所属实体的功能时创建代理。

您也可以使用命令行工具手动生成代理。

关于错误: 您应该使用partnerId而不是partner_id。 Partner_id是数据库列的名称,而不是您的产品实体中定义的属性。

$query = $em->createQuery(' 
    SELECT pp.name, p.id 
    FROM Application\Entity\Product AS p 
    LEFT JOIN Application\Entity\Partner AS pp WITH p.partnerId = pp.id GROUP by p.partnerId 
'); 
$items = $query->getResult(); 

有一个在DQL文档好好看看: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

也许它会给你有关SQL和DQL的区别一些额外的见解。