Doktrini kullanarak On Self Üyelik Tablo (DQL)

1 Cevap php

Ben öğretinin DQL kullanarak kendi üzerinde bir tablo katılmak için çalışılıyor. Senaryo:

Ben de ürün nitelik değerleri bir tablo bir referans tablosu aracılığıyla bir ürün tabloya bağlantılı var. Ürün nitelik değerleri ürünlerindeki filtreler olarak hizmet için vardır, bu nedenle, ürünlerin değerleri tablo birden fazla öznitelik filtrelemek için kendi üzerine geri katıldı gerekiyor bağlıyoruz.

Şöyle Benim yöntem:

public static function getProductsByCategoryCode($productCategoryCode, $currencyCode, Zend_Session_Namespace $filters = null)
{
    $products = Doctrine_Query::create()
        ->from('Products p')
        ->leftJoin('p.ProductCategories pc')
        ->leftJoin('p.ProductPrices pp')
        ->leftJoin('pp.Currencies c')
        ->where('pc.product_category_code = '. $productCategoryCode)
        ->addWhere('c.currency_code = "'. $currencyCode . '"');

    if($filters !== null)
    {   
        $i = 0;

        foreach($filters as $index => $value)
        {
            $alias = 'pav_' . (string)$i;

            $products
                ->leftJoin('p.ProductAttributeValues ' . $alias)
                ->addWhere($alias . '.product_attribute_code = "'. $index . '"')
                ->addWhere($alias . '.value = "'. $value . '"');

            $i++;
        }
    }

    die($products->getSql());

    return $products->execute();
}

Sorun getSql() çağrısı elde edilen SQL (MySQL hata: #1066 - Not unique table/alias: 'p6') ürün nitelik değer linkler tablo için 'takma yinelenen olmasıdır. Muhtemelen, bu yeniden kullanılabilecek nitelik değerlerini ürünler ve ürün arasındaki ilişkinin referans (ürün nitelik değeri bağlantılar) kaynaklanmaktadır.

Oluşturulan SQL olduğunu:

SELECT 
p.product_code AS p__product_code, 
p.name AS p__name, 
p.description AS p__description, 
p2.product_category_code AS p2__product_category_code, 
p2.name AS p2__name, 
p2.category_route AS p2__category_route, 
p2.parent_product_category_code AS p2__parent_product_category_code, 
p2.lft AS p2__lft, 
p2.rgt AS p2__rgt, 
p2.level AS p2__level, 
p4.currency_code AS p4__currency_code, 
p4.product_code AS p4__product_code, 
p4.net_value AS p4__net_value, 
c.currency_code AS c__currency_code, 
p5.product_attribute_value_id AS p5__product_attribute_value_id, 
p5.product_attribute_code AS p5__product_attribute_code, 
p5.value AS p5__value, 
p7.product_attribute_value_id AS p7__product_attribute_value_id,
p7.product_attribute_code AS p7__product_attribute_code, 
p7.value AS p7__value 
FROM 
products p 
LEFT JOIN 
product_category_links p3 ON p.product_code = p3.product_code 
LEFT JOIN 
product_categories p2 ON p2.product_category_code = p3.product_category_code 
LEFT JOIN 
product_prices p4 ON p.product_code = p4.product_code 
LEFT JOIN 
currencies c ON p4.currency_code = c.currency_code 
LEFT JOIN 
product_attribute_value_links p6 ON p.product_code = p6.product_code 
LEFT JOIN 
product_attribute_values p5 ON 
p5.product_attribute_value_id = p6.product_attribute_value_id 
LEFT JOIN 
product_attribute_value_links p6 ON p.product_code = p6.product_code 
LEFT JOIN 
product_attribute_values p7 ON 
p7.product_attribute_value_id = p6.product_attribute_value_id 
WHERE 
p2.product_category_code = 10100 
AND 
c.currency_code = "GBP" 
AND 
p5.product_attribute_code = "BRAND" 
AND 
p5.value = "Advanced Hair Gear" 
AND 
p7.product_attribute_code = "SIZE" AND p7.value = "238 ml"

Gördüğünüz gibi, P6 iki bir takma ad olarak görünür.

Herkes DQL kullanarak bu ulaşmak için doğru yöntemi biliyor mu?

Şimdiden çok teşekkürler.

1 Cevap

Basit bir çözüm olup olmadığını bilmiyorum, ama sadece kendiniz katılır belirtmek gerekir:

        ->leftJoin('p.ProductAttributeValuesLinks ' . $alias1)
        ->leftJoin($alias1 '.ProductAttributeValue ' . $alias2)

Eğer bağlantı masaya aşağıdaki gibi bir şey kurmak eğer:

  relations:
    Product:
      class: Products
      foreignType: many
    ProductAttributeValue:
      class: ProductAttributeValues
      foreignType: many