gpt4 book ai didi

symfony - 使用 Doctrine 注释的 Symfony2 中的多个 JoinColumns?

转载 作者:行者123 更新时间:2023-12-01 22:40:21 24 4
gpt4 key购买 nike

问题是:

Routing具有属性 objectIdobjectType . objectId是一个整数,objectType是一个字符串。这样做的原因是允许同一张表保存不同类型路由的数据。例如 Products 的路由, DepartmentBrand .因此,objectType 的组合和 objectId是我的 JoinColumn。

如何与 Doctrine2 建立这种双向关系?我查看了继承关系,但似乎没有一个概念是我要找的。

我可以在数据库中创建一些 View ,并且只有几个不同的路由实体,但这似乎不是最佳路由。

这是我的实体 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;
...

每个产品、品牌和部门都有自己的 URL,保存在 object_type 设置的路由表中。和 object_id object_type在哪里就是department , productbrandobject_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>;
}

有人能帮忙吗?

最佳答案

经过进一步研究,我发现一位知情人士 (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 实体。

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

然后在每个 ProductDepartmentBrand 实体中,我需要添加新的 $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;
...

希望对您有所帮助...

关于symfony - 使用 Doctrine 注释的 Symfony2 中的多个 JoinColumns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com