使用关联实体字段设置slug

时间:2012-09-04 12:13:26

标签: php symfony doctrine-orm

我正在使用DoctrineExtensions为我的实体获取可缓慢的行为。我的一个实体我想使用相关地址实体的城市字段作为slug。但是,我不知道如何访问它:

/**
 * @var Foo\SiteBundle\Entity\Address
 *
 * @ORM\ManyToOne(targetEntity="Foo\SiteBundle\Entity\Address", cascade={"persist"})
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="address_id", referencedColumnName="id")
 * })
 */
private $address;

/**
 * @Gedmo\Slug(fields={"address->city", "name"})
 * @ORM\Column(length=128, unique=true)
 */
private $slug;

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

你可以执行它:https://github.com/l3pp4rd/DoctrineExtensions/issues/86

但是https://github.com/l3pp4rd/DoctrineExtensions

  

2012-02-26

     

删除了slug处理程序,这个功能带来了混乱   无法维持。

不幸的是,此功能已被删除!

所以我认为你必须改变你的逻辑:例如,你可以使用包含地址的slug和当前实体的路由并加载实体作为回应:

@Route("/user/{slugUser}/{slugAddress}.html", requirements={"slugUser"="^[a-z0-9-]+", "slugAddress"="^[a-z0-9-]+"})

或者也许是一个解决方案,尝试设置manually ...并自动设置lifecycles,但我不确定它是否有效:

/**
 * @Gedmo\Slug(fields={})
 * @ORM\Column(length=128, unique=true)
 */
private $slug;

/**
 * @ORM\PrePersist
 */
public function updateSlug()
{
    $this->setSlug($this->name.$this->address->getCity());
}

答案 1 :(得分:0)

您无法直接执行此操作,因为可缓存扩展只能使用实体的直接字段。我能想到的唯一方法,虽然有点笨拙,但是要添加一个跟踪地址城市的字段。类似的东西:

/**
 * @ORM\Column(length=128)
 */
private $city;

/**
 * @Gedmo\Slug(fields={"city", "name"})
 * @ORM\Column(length=128, unique=true)
 */
private $slug;

//setter for Address
public function setAddress($address) {
    $this->address= $address;
    $this->city = $address->getCity();
}

我不确定是否需要将数据库持久保存到数据库中(例如,如果您需要使用@ORM \ Column),或者如果扩展可以使用未持久化的属性,则只需尝试不使用@ORM注释,看它是否有效。