Doctrine - 在另一个模型中引用相同id字段的多个模型

时间:2010-05-19 14:01:36

标签: php sql doctrine

我有一个文件模型和多个(当前3个)不同的其他模型(文章,作业,事件),这些模型都可以存储在文件模型中。

问题是,当我通过CLI-Tool(./doctrine build-all-reload)生成表时,我收到此错误消息:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot 
add or update a child row: a foreign key constraint fails 
(`my_database/articles`, CONSTRAINT `articles_id_files_target_id`
FOREIGN KEY (`id`) REFERENCES `files` (`target_id`))

文件定义为(在此模型中定义的关系没有定义):

columns:
  id:
    primary: true
    autoincrement: true
    type: integer(4)
  target_id: integer(4)
  filename: string(255)
[...]

所有4个模型都有这个关系定义:

  relations:
    Files:
      type: many
      class: File
      local: id
      foreign: target_id

这是Doctrine生成的Php-Code(BaseFile.php):

public function setUp()
{
    parent::setUp();
    $this->hasOne('Publication', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Event', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Article', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Job', array(
         'local' => 'target_id',
         'foreign' => 'id'));
}

我理解为什么会发生这种情况(不能为多个表设置约束),但不知道如何在没有多个文件表或关联表的情况下解决这个问题。

有没有办法告诉Doctrine它不应该在File模型中创建关系?

有什么好主意吗?

2 个答案:

答案 0 :(得分:0)

如果您需要,请尝试 关系:

Files:
  type: many
  class: File
  local: target_id
  foreign: id
Files2:
  type: many
  class: File
  local: id
  foreign: id

答案 1 :(得分:0)

您可以尝试以下内容:

columns:
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true }
    target_id:  { type: integer(4), notnull: true }
    model:       { type: string, notnull: true }

文件模型需要知道链接条目的id和模型。因此,在Files.class.php中,您还可以指定:

public function getArticles() {
    if (strcmp($this->getModel(), 'Articles')) {
        return Doctrine::getTable('Articles')->findOneById($this->getTargetId());
    } else {
        return false;
    }
}

可能有更好的方法,但在这种情况下,你有1个表,你不需要任何更多的关系,但你必须自己指定getter / setter。所以这取决于你的目标是否会变冷。