我有两张桌子:
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();
它会删除两者。
答案 0 :(得分:2)
Yii没有实现自动处理子关系上的DB写操作的逻辑。因此,由您决定如何实现目标。有不同的方式:
使用您的数据库并在外键列上定义ON DELETE CASCADE
约束。不需要额外的Yii逻辑。
覆盖beforeDelete()
的{{1}} beforeSave()
afterDelete()
afterSave()
个功能或使用事件系统(请参阅wiki)来实施你的模型中的逻辑。
使用您的控制器并手动完成工作。
我总是使用第一种方式(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']);
}