2013-03-11 3 views
2

Вот проблема:Несколько JoinColumns в Symfony2 с помощью аннотаций Doctrine?

Класс Routing с атрибутами objectId и objectType. objectId - это int, а objectType - это строка. Причина этого заключалась в том, чтобы позволить одной и той же таблице хранить данные для разных типов маршрутов. Например, для маршрутизации Products, Department и Brand. Таким образом, комбинация objectType и objectId - это моя JoinColumn.

Как создать такую ​​двунаправленную связь с Doctrine2? Я смотрел на унаследованные отношения, но ни одна из этих концепций не была тем, что я ищу.

Я мог бы создать несколько представлений в базе данных и просто иметь несколько разных объектов маршрутизации, но это не лучший маршрут.

вот мои лица Department, Product и Brand.

../Entity/Department.php

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
* @ORM\Table(name="departments") 
*/ 
class Department implements DescribableInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

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

../Entity/Product.php

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="products") 
*/ 
class Product implements DescribableInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @ORM\Column(name="product_code", type="string", length=100, nullable=true) 
    */ 
    private $productCode = ''; 

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

../Entity/Brand.php

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="brands") 
*/ 
class Brand 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="status", type="string", length=1) 
    */ 
    private $status = 'a'; 

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

Каждый продукт, бренд и отдел имеет свой собственный URL, который проводится в таблице маршрутизации, установленной object_type и object_id, где object_type является просто department, product или brand, а object_id является уникальным идентификатором соответствующего продукта, бренда или отдела.

../Entity/Routing.php

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="routing") 
*/ 
class Routing 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id;  

    /** 
    * @ORM\Column(name="object_id", type="integer", length=11) 
    */ 
    private $objectId; 

    /** 
    * @ORM\Column(name="object_type", type="string", length=100) 
    */ 
    private $objectType; 

    /** 
    * @ORM\Column(name="url", type="text") 
    */ 
    private $url; 
... 

То, что я действительно борется с, как мне установить связь, поэтому отделы, продукты и бренды могут получить доступ к URL из одного объекта маршрутизации.

Я попытался добавить отношения к $objectId, но, похоже, это не так. Можно ли настроить это так?

То, что я в основном пытаюсь достичь, чтобы получить объект данных и иметь возможность получить URL объекта, например:

$departments = $em->getRepository("AdamStaceySiteBundle:Department")->findAll(); 
foreach ($departments as $department) 
{ 
    echo '<a href="'.$department->getUrl().'">'.$department->getMenuTitle().'</a>; 
} 

Может кто-нибудь помочь?

+0

Можете ли вы предоставить соответствующий код? – Hast

+6

Я один, кто не спрашивает? –

+0

@ ElnurAbdurrakhimov Вот почему я попросил код :) – Hast

ответ

4

После дальнейших исследований я обнаружил человека (Дирка Ольберца) в понимании, у которого была такая же проблема.

информацию можно найти по адресу: Google Groups: Multiple JoinColumns?

Я теперь реализованы это, и я объясню, как я это сделал упаковывают это может помочь кому-либо еще.

Ответ на мою проблему состоял в использовании единственного наследования таблиц.

Первое, что мне нужно сделать, это обновляют routing объект использовать единую таблицу наследования:

../Entity/Routing.php

/** 
* @ORM\Entity 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="object_type", type="string") 
* @ORM\DiscriminatorMap({"product" = "ProductRouting", "department" = "DepartmentRouting", "brand" = "BrandRouting"}) 
* @ORM\Table(name="routing") 
*/ 
class Routing 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="id", type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
... 

DiscriminatorColumn позволило мне указать, какой столбец будет использоваться для связи, которая в этот случай был полем object_type.

DiscriminatorMap разрешил мне указать, что object_type свяжется с какими объектами.

Затем необходимо было создать эти объекты, которые расширили объект Routing.

../Entity/ProductRouting.php

/** 
* @ORM\Entity 
*/ 
class ProductRouting extends Routing 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Product") 
    * @ORM\JoinColumn(name="object_id", referencedColumnName="id") 
    */ 
    protected $product; 
... 

../Entity/DepartmentRouting.php

/** 
* @ORM\Entity 
*/ 
class DepartmentRouting extends Routing 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Department") 
    * @ORM\JoinColumn(name="object_id", referencedColumnName="id") 
    */ 
    protected $department; 
... 

../Entity/BrandRouting.php

/** 
* @ORM\Entity 
*/ 
class BrandRouting extends Routing 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Brand") 
    * @ORM\JoinColumn(name="object_id", referencedColumnName="id") 
    */ 
    protected $brand; 
... 

Тогда в каждом из Product, Department и Brand лиц мне нужно добавить тыс e новый $routings.

../Entity/Product.php

... 
class Product 
{ 
    ... 
    /** 
    * @ORM\OneToMany(targetEntity="ProductRouting", mappedBy="product", cascade={"all"}) 
    */ 
    private $routings; 
... 

../Entity/Department.php

... 
class Department 
{ 
    ... 
    /** 
    * @ORM\OneToMany(targetEntity="DepartmentRouting", mappedBy="department", cascade={"all"}) 
    */ 
    private $routings; 
... 

../Entity/Brand.php

... 
class Brand 
{ 
    ... 
    /** 
    * @ORM\OneToMany(targetEntity="BrandRouting", mappedBy="brand", cascade={"all"}) 
    */ 
    private $routings; 
... 

Надежда, что помогает ...

Смежные вопросы