0

我有一个表(称为表 A)需要在创建表 A 记录时创建多个附加子记录。删除表 A 记录应该删除表 B 记录。

删除记录很容易使用ON DELETE CASCADEin schema.yml,但添加记录并不是那么简单。覆盖Doctrine_Record::postInsert不会这样做,因为表 A 记录还没有 ID。覆盖Doctrine_Formsave 也不会这样做。

EventListener要走的路还是数据库触发器?如果是前者,你有例子吗?如果是后者,可以以某种方式指定触发器schema.yml吗?

4

1 回答 1

0

你确定这postInsert不起作用吗?

我在我的一个项目中使用了这个片段(在里面Table.class.php):

public function postInsert($event)
{
  $dispatcher = ProjectConfiguration::getActive()->getEventDispatcher();
  $dispatcher->notify(new sfEvent($this, 'item.new', array(
    'item' => $this
  )));
}

我传播了一个关于新项目的活动。然后,我在我的配置中捕获了这个事件:

class frontendConfiguration extends sfApplicationConfiguration
{
  public function configure()
  {
    // [....]
    $this->dispatcher->connect('item.new', array('shareEvents', 'postToSocial'));

在我的shareEvents课堂上,我可以毫无问题地访问项目 ID:

class shareEvents
{
  static public function postToSocial(sfEvent $event)
  {
    $item = $event['item'];

    $queue = new AutopostQueue();
    $queue->setItemId($item->getId());
    $queue->save();

顺便说一句,您也可以在触发器中执行操作。但我不认为你可以在内部定义触发器,schema.yml因为 Doctrine 解析它以生成模型、表单等。但是你可以trigger.sql在目录中定义一个文件/data/sql,它会在你调用时自动加载:

php symfony doctrine:insert-sql
于 2012-09-17T22:32:25.293 回答