2011-04-08 49 views
7

我想从product_item表中选择基于productId和toolboxItemId的product_item_sortorder表中的匹配行。Doctrine 2 ManyToOne with multiple joinColumns

在正常的SQL,这将是对于给定的产品编号:

SELECT pi.*, pis.* FROM product_item pi 
LEFT JOIN product_item_sortorder pis 
    ON pi.productId = pis.productId 
    AND pi.toolboxItemId = pis.toolboxItemId 
WHERE pi.productId = 6 

我写的DQL它如下:

$this->_em->createQuery(
    'SELECT pi 
    FROM Entities\ProductItem pi 
    LEFT JOIN pi.sequence s 
    WHERE pi.product = ?1' 
); 

然后我得到下面的SQL如果我输出的$查询 - > getSQL():

SELECT p0_.id AS id0, p0_.productId AS productId1, p0_.priceGroupId AS priceGroupId2, p0_.toolboxItemId AS toolboxItemId3, p0_.levelId AS levelId4, p0_.parentId AS parentId5, p0_.productId AS productId6, p0_.toolboxItemId AS toolboxItemId7 FROM product_item p0_ LEFT JOIN product_item_sortorder p1_ ON p0_.productId = p1_. AND p0_.toolboxItemId = p1_. WHERE p0_.productId = ? ORDER BY p0_.id ASC 

正如你可以看到referencedColumnNames都没有发现:

012在product_item表个
LEFT JOIN product_item_sortorder p1_ ON p0_.productId = p1_. AND p0_.toolboxItemId = p1_. 

细节:product_item_sortorder表

+-----+-----------+---------------+ 
| id | productId | toolboxItemId | 
+-----+-----------+---------------+ 
| 467 |   1 |    3 | 
| 468 |   1 |   10 | 
| 469 |   1 |   20 | 
| 470 |   1 |    4 | 
| 471 |   1 |   10 | 
+-----+-----------+---------------+ 

详情:

+-----+-----------+---------------+----------+ 
| id | productId | toolboxItemId | sequence | 
+-----+-----------+---------------+----------+ 
| 452 |   1 |    3 |  1 | 
| 457 |   1 |    4 |  6 | 
| 474 |   1 |   20 |  4 | 
+-----+-----------+---------------+----------+ 

ProductItem实体

<?php 
/** 
* @Entity(repositoryClass="Repositories\ProductItem") 
* @Table(name="product_item") 
*/ 
class ProductItem 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="ProductItemSortorder") 
    * @JoinColumns({ 
    *  @JoinColumn(name="productId", referencedColumnName="productId"), 
    *  @JoinColumn(name="toolboxItemId", referencedColumnName="toolboxItemId") 
    * }) 
    */ 
    protected $sequence; 

    ... 
?> 

ProductItemSortOrder实体

<?php 
/** 
* @Entity(repositoryClass="Repositories\ProductItemSortorder") 
* @Table(name="product_item_sortorder") 
*/ 
class ProductItemSortorder 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="Product") 
    * @JoinColumn(name="productId", referencedColumnName="id") 
    */ 
    protected $product; 

    /** 
    * @ManyToOne(targetEntity="ToolboxItem") 
    * @JoinColumn(name="toolboxItemId", referencedColumnName="id") 
    */ 
    protected $toolboxItem; 

    ... 
} 
?> 

回答

3

您的映射严重错误。你在两端使用ManyToOne,这怎么可能?您将两个关联定义为“拥有”,不映射或反转(请参阅关联映射章节)。并且您正在使用一个关联的连接列来映射另一个实体中的许多字段。我想你想做别的事情,你能描述一下你的用例吗?

+0

我更新了一点问题位和下面你可以看到我想执行哪个查询 – tom 2011-04-12 10:15:40

1

你会如何映射在YAML你的榜样(因为@Hernan Rajchert的例子只是说明):

ProductItem: 
    type: entity 

    manyToOne: 
     sequence: 
      targetEntity: ProductItemSortorder 
      joinColumns: 
       productId: 
        referencedColumnName: productId 
       toolboxItemId: 
        referencedColumnName: toolboxItemId