2011-04-08 24 views
7

मैं product_item_sortorder तालिका में product_item_sortorder तालिका में मिलान पंक्ति को चुनने का प्रयास कर रहा हूं product_item तालिका से productId और toolboxItemId।सिद्धांत एकाधिक एकाधिक एकाधिक कॉल के साथ कई कॉलम

सामान्य एसक्यूएल कि किसी दिए गए productId का होगा में:

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():

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 आप देख सकते हैं नहीं पाए जाते हैं:

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; 

    ... 
} 
?> 

उत्तर

3

आपकी मैपिंग गंभीर रूप से गलत हैं। आप दोनों सिरों पर ManyToOne का उपयोग कर रहे हैं, यह कैसे संभव है? आपके पास दोनों संगठनों को "स्वामित्व" के रूप में परिभाषित किया गया है, कोई मैप-इन या इनवर्ड्स-द्वारा (एसोसिएशन मैपिंग्स अध्याय देखें)। और आप किसी अन्य इकाई में कई फ़ील्ड को मैप करने के लिए एक एसोसिएशन के कॉलम कॉलम का उपयोग कर रहे हैं। मुझे लगता है कि आप कुछ और करना चाहते हैं, क्या आप वास्तव में अपने उपयोग-मामले का वर्णन कर सकते हैं? समग्र में शामिल होने के स्तंभ के लिए इस उदाहरण पर

+0

मैं सवाल एक छोटे से अद्यतन थोड़ा और नीचे आप देख सकते हैं कि मैं कौन सी क्वेरी निष्पादित करना चाहता हूं – tom

1

कैसे आप YAML में अपने उदाहरण नक्शा होगा (के बाद से @Hernan Rajchert के उदाहरण केवल एनोटेशन में है):

ProductItem: 
    type: entity 

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