【问题标题】:Doctrine 2 ManyToOne with multiple joinColumns具有多个 joinColumns 的 Doctrine 2 ManyToOne
【发布时间】:2011-04-08 08:32:09
【问题描述】:

我正在尝试根据 product_item 表中的 productId 和 toolboxItemId 在 product_item_sortorder 表中选择匹配行。

在针对给定 productId 的普通 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'
);

如果我输出 $query->getSQL(),我会得到以下 SQL:

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

如您所见,未找到引用的ColumnName:

LEFT JOIN product_item_sortorder p1_ ON p0_.productId = p1_. AND p0_.toolboxItemId = p1_. 

product_item 表的详细信息:

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

product_item_sortorder 表的详细信息:

+-----+-----------+---------------+----------+
| 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;

    ...
}
?>

【问题讨论】:

    标签: mapping left-join doctrine-orm many-to-one


    【解决方案1】:

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

    【讨论】:

    • 我稍微更新了问题,您可以在下面看到我要执行的查询
    【解决方案2】:

    您将如何在 YAML 中映射您的示例(因为 @Hernan Rajchert 的示例仅在注释中):

    ProductItem:
        type: entity
    
        manyToOne:
            sequence:
                targetEntity: ProductItemSortorder
                joinColumns:
                    productId:
                        referencedColumnName: productId
                    toolboxItemId:
                        referencedColumnName: toolboxItemId
    

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多