2011-04-08 10 views
7

Tôi đang cố gắng chọn hàng phù hợp trong bảng product_item_sortorder dựa trên productId và toolboxItemId từ bảng product_item.Học thuyết 2 ManyToOne với nhiều tham giaColumns

Trong SQL bình thường đó sẽ là một productId đưa ra:

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 

tôi viết DQL cho nó như sau:

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

Sau đó, tôi nhận được sau SQL nếu tôi sản lượng $ query- > 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 

Như bạn có thể thấy các tham chiếuColumnNames không được tìm thấy:

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

chi tiết của bảng product_item:

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

chi tiết của bảng product_item_sortorder:

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

ProductItem Entity

<?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 Entity

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

    ... 
} 
?> 

Trả lời

3

Ánh xạ của bạn bị lỗi nghiêm trọng. Bạn đang sử dụng ManyToOne trên cả hai đầu, làm thế nào điều này có thể? Bạn có cả hai hiệp hội được định nghĩa là "sở hữu" -side, không có ánh xạ-by hoặc inversed-by (Xem Chương Mappings chương). Và bạn đang sử dụng các cột nối của một liên kết để ánh xạ tới nhiều trường trong một thực thể khác. Tôi cho rằng bạn muốn làm điều gì khác, bạn có thể mô tả chính xác trường hợp sử dụng của bạn không?

+0

Tôi cập nhật các câu hỏi một chút bit và bên dưới bạn có thể thấy truy vấn nào tôi muốn thực thi – tom

1

Làm thế nào bạn sẽ lập bản đồ ví dụ của bạn trong YAML (vì dụ @Hernan Rajchert là chỉ trong các chú thích):

ProductItem: 
    type: entity 

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