2013-03-11 44 views
2

這裏的問題是:Symfony2中使用Doctrine批註的多個JoinColumns?

具有屬性objectIdobjectTypeRoutingobjectId是一個int,而objectType是一個字符串。原因是允許同一張表保存不同類型的路由數據。例如,路由Products,DepartmentBrand。所以,objectTypeobjectId的組合就是我的JoinColumn。

如何與Doctrine2建立這種雙向關係?我研究了遺傳關係,但沒有一個概念似乎是我期待的。

我可以在數據庫中創建一些視圖,只是有幾個不同的路由實體,但這似乎不是最好的路線。

這裏是我的實體Department,ProductBrand

../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; 
... 

每個產品,品牌和部門具有在由object_type並設置路由表舉行了自己的網址object_id其中object_type只是department,productbrandobject_id是相應產品,品牌或部門的唯一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; 
... 

我真的很掙扎是怎樣安裝的關係,使各部門,產品和品牌能夠從單一路由訪問他們的網址。

我曾嘗試將關係添加到$objectId,但似乎並不那樣。是否可以像這樣設置?

什麼,我基本上是試圖實現的是獲取數據對象,並要得到一個對象的URL的能力,例如:

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

誰能幫助?

+0

你能否提供相關的代碼? – Hast 2013-03-11 17:26:56

+6

我獨自一人誰沒有得到這個問題? – 2013-03-11 19:11:12

+0

@ElnurAbdurrakhimov這就是爲什麼我要求代碼:) – Hast 2013-03-11 19:43:52

回答

4

經過進一步的研究,我發現一個男人(Dirk Olbertz)知道誰有同樣的問題。

信息,可以發現在: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實體。

​​

/** 
* @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; 
... 
在每個 ProductDepartmentBrand實體

然後我需要添加第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; 
... 

希望幫助...