Yii删除有关系的活动记录

时间:2014-08-26 13:40:44

标签: php yii

我有两张桌子:

users{
id
username
password
}

person{
id
fname
lname
user_id
}
用户模型中的

和关系:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'person'=>array(self::HAS_ONE, 'Person', 'user_id'),
    );
}

在教程中有人说我可以通过在用户控制器中写入来删除它们:

$this->loadModel($id)->person->delete();

但它只删除数据库中的人员记录。

如果我写:

$this->loadModel($id)->with('person')->delete();

这将仅删除db。

中的用户记录

如何删除使用这些关系或更改它们?

当然我可以用3行写出来:

$user=$this->loadModel($id);
Person::model()->findByPk($user->person_id)->delete();
$user->delete();

它会删除两者。

3 个答案:

答案 0 :(得分:2)

Yii没有实现自动处理子关系上的DB写操作的逻辑。因此,由您决定如何实现目标。有不同的方式:

  1. 使用您的数据库并在外键列上定义ON DELETE CASCADE约束。不需要额外的Yii逻辑。

  2. 覆盖beforeDelete()的{​​{1}} beforeSave() afterDelete() afterSave()个功能或使用事件系统(请参阅wiki)来实施你的模型中的逻辑。

  3. 使用您的控制器并手动完成工作。

  4. 我总是使用第一种方式(1.)并实现数据库约束。但有时在删除DB记录之前必须处理一些逻辑。然后我会选择第二种方式(2.)可能与第一种方式相结合。

    实现控制器内部的所有逻辑(3.)并不是一个好的代码风格,除非您确信在项目的其他部分不需要实现的代码。

答案 1 :(得分:0)

我通常会覆盖onDelete或执行以下操作。

if($user->delete()){
 Yii::app()->db->createCommand("Delete from userProfile where user_id={$model->id}")->execute();
}

答案 2 :(得分:0)

这对我有用:

在用户控制器中:

public function actionDelete($id) {
  $model = $this->findModel($id);

  foreach($model->persons as $person)
    $person->delete();

  $model->delete();
  return $this->redirect(['index']);
}

您必须在用户模型中具有一个名为“ persons”的属性依赖项:

* @property Person[] $persons

/**
 * @return \yii\db\ActiveQuery
 */
public function getPersons()
{
    return $this->hasMany(Person::className(), ['user_id' => 'id']);
}