2

問題は次のとおりです。

Routing属性objectIdとを持つクラスobjectTypeobjectIdは整数でobjectType、文字列です。その理由は、同じテーブルが異なる種類のルーティングのデータを保持できるようにするためでした。たとえば、ProductsDepartmentおよびのルーティングの場合Brand。したがって、 と の組み合わせobjectTypeobjectId私の JoinColumn です。

Doctrine2 との双方向の関係を作成するにはどうすればよいですか? 継承された関係を調べましたが、どの概念も私が探しているものではないようでした。

データベースにいくつかのビューを作成して、いくつかの異なるルーティング エンティティを作成することもできますが、これは最適なルートではないようです。

これが私のエンティティDepartmentProductおよび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ます。departmentproductbrandobject_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>;
}

誰でも助けることができますか?

4

1 に答える 1

6

さらに調査した結果、同じ問題を抱えていることを知っている男性 (Dirk Olbertz) を見つけました。

情報は次の場所にあります: Google グループ: 複数の 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エンティティDepartmentBrand、新しい を追加する必要がありました$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;
...

それが役立つことを願っています...

于 2013-03-12T12:50:01.493 に答える