【问题标题】:CakePHP - delete cascade not workingCakePHP - 删除级联不起作用
【发布时间】:2011-04-19 07:23:04
【问题描述】:

在 CakePHP 中,我有一个模型类型和特定类型。

SpecificType 属于一个类型。 (type_id 字段)

当我删除一个SpecificType的条目时,我怎样才能同时删除Type?

我有它

$this->SpecificType->del($id, true)

但是,类型下的条目并没有被删除。

谢谢,
三通

【问题讨论】:

  • 为什么要在删除特定类型时删除基本类型?删除级联只能在 hasMany not belongsTo 上进行

标签: cakephp


【解决方案1】:

我认为您不能使用 SpecificType 级联删除 Type。如果存在 hasMany 或 HABTM 关系,则只能使用级联。

说明书上说的。

删除由 $id 标识的记录。默认情况下,也会删除记录 取决于指定的记录 被删除。

例如,当删除用户时 与许多食谱相关的记录 记录(用户“hasMany”或 'hasAndBelongsToMany' 食谱):

* if $cascade is set to true, the related Recipe records are also

如果模型依赖值被删除 设置为真。 * 如果 $cascade 设置为 false,Recipe 记录将在 用户已被删除。

你总是可以运行

$this->del($id, true);

使用相关的 SpecificType-s 删除您的类型。

【讨论】:

    【解决方案2】:

    您要删除类型,而不是特定类型。您还需要确保为 Type 正确设置了模型:

    var $hasMany = array(
        'SpecificType' => array(
        'className' => 'SpecificType',
        'foreignKey' => 'type_id',
        'dependent'=> true,
        )
    );
    

    然后删除类型就行了。

    如果您要删除子 (SpecificType) 并且要删除它的父模型,则必须在父模型上调用 delete。但请记住,如果您正确设置了 Cascade(模型上为 dependent = true),则无论如何都会删除所有 SpecificType 子级。

    注意:如果您想删除孩子的父母,您可能需要重新考虑您的关系并确认它们是正确的。如果这真的是你想要的,那么不要对孩子进行删除。只需确保您的级联关系设置正确,拉取孩子的父信息,然后删除父。然后所有的孩子也将被删除。

    【讨论】:

    • 从属索引+1。我在文档中查看了它。
    【解决方案3】:

    我在不想关注Cake model key convention 的情况下遇到了同样的问题。

    我将SpecificType模型的belongsTo关系设置为Type,如下所示:

    public $belongsTo = array(
      'Type' => array(
        'className' => 'Type',
        'foreignKey' => 'type_id',
        'conditions' => '',
        'fields' => '',
        'order' => '',
      ),
    );
    

    然后为了让级联删除工作,我在 SpecificType 模型中添加了以下内容:

    public function beforeDelete($cascade) {
      // Make sure the parent method runs.
      $continue = parent::beforeDelete($cascade);
    
      if ($continue) {
        // Delete the Type if there is one.
        $typeId = $this->field('type_id');
        if (!empty($typeId)) {
          $continue = $this->Type->delete($typeId);
        }
      }
    
      return $continue;
    }
    

    我希望这对遇到与您相同问题的人有所帮助,因为我确信您还没有等待答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-22
      • 2013-03-03
      • 2012-11-18
      • 2011-06-11
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多