我正在使用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;
我该如何做到这一点?
答案 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注释,看它是否有效。