2015-06-05 1 views
0

В приведенном ниже примере тип $ может быть как «брендом», так и «категорией», а $ slug будет либо брендом, либо категорией.результаты фильтрации, основанные на двух отношениях ManyToOne в Symfony2

Как подойти к этому, когда я хочу фильтровать результаты по категории и бренду одновременно?

public function getGroupAction($slug, $type = null, $grouped = true) 
{ 

    $group = $this->getDoctrine() 
     ->getRepository('AudsurShopBundle:'.$type) 
     ->findOneBy(array('name' => $slug)) 
     ->getProducts(); 

    return $this->render('AudsurShopBundle:Default:productOverview.html.twig', array(
      'group' => $group 
     ) 
    ); 

} 

ответ

0

Чтобы сделать то, что вы хотите сделать, вы должны использовать Class table inheritance с системой колонки дискриминатора.

Для примера, создайте следующий объект:

<?php 

namespace ... 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discriminator", type="string") 
* @ORM\DiscriminatorMap({"category" = "Category", "brand" = "Brand"}) 
*/ 
abstract class NameHolder 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    // Getters and setters 
} 

, а затем сделать ваши 2 лица наследуют этот класс:

<?php 

namespace ...; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* FirstChild 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Category extends NameHolder 
{ 
    // all methods and properties except from the "name" 
} 

и:

<?php 

namespace ...; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* FirstChild 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Brand extends NameHolder 
{ 
    // all methods and properties except from the "name" 
} 

Итак, теперь вы можете сделайте запрос следующим образом:

$group = $this->getDoctrine() 
    ->getRepository('AudsurShopBundle:NameHolder') 
    ->findOneBy(array('name' => $slug)) 
    ->getProducts(); 

Это вернет массивную коллекцию с объектами Brand и Category.

Однако я не уверен, что класс NameHolder действительно имеет смысл. Другим решением было бы сделать отдельные запросы для обоих объектов без изменения каких-либо из ваших объектов, но это не то, что вы, похоже, ищете.