Предисловие
Мультимодель и функции Yii2 часто используются, но в Интернете доступно не так много ресурсов. Поэтому я считаю необходимым сделать краткое изложение и поделиться. Товарищ Лэй Фэн последовательный стиль, без объяснений. В то время, когда я пил кофе, я лично ездил на море, чтобы сражаться, практиковаться в правде, не играть на словах, рассказывать вещи по опыту. Ладно, Хватит. Если вам это не интересно, вы можете проигнорировать это. Если вам интересно, вы можете продолжать смотреть вниз. Вы определенно получите много.
Объективный анализ
Поделитесь простым использованием мультимодели Yii2 и транзакциями на практике.
Несколько моделей
1. Секция контроллера
public function actionCreate()
{
$model = new OpportunityType();
$_model=new User();
$post=Yii::$app->request->post();
if(isset($post['User']) && isset($post['OpportunityType']))
{
$model->attributes=$post['OpportunityType'];
$_model->attributes=$post['User'];
If ($model - > validate () & & $_model - > validate ()/// here is to validate the data first, if it passes through save ().
{
$model - > save (false); // save is not validated (previously validated, so this can be set to false)
$_model->save(false);
return $this->redirect(['view', 'id' => $model->id]);
}else {
return $this->render('create', [
'model' => $model,
'_model'=>$_model,
]);
}
} else {
return $this->render('create', [
'model' => $model,
'_model'=>$_model,
]);
}
}2. Просмотр раздела
Примечание: В этой части используется несколько моделей. Данные могут быть сохранены только после прохождения двух проверок Типа возможности и Пользователя.
дело
1. Секция контроллера
public function actionCreate()
{
$model = new OpportunityType();
$_model=new User();
$post=Yii::$app->request->post();
if(isset($post['User']) && isset($post['OpportunityType']))
{
$db = Yii::$app->db;
$transaction = $db - > beginTransaction (); // Open a transaction
try {
$model->attributes=$post['OpportunityType'];
$_model->attributes=$post['User'];
If ($_model-> save ()/// here is to validate the data first, if it passes through save ().
{
$model->user_id=$_model->id;
if(!$model->save()){
$error=array_values($model->getFirstErrors())[0];
Throw new Exception ($error); // throw an exception
}
}else{
$error=array_values($_model->getFirstErrors())[0];
Throw new Exception ($error); // throw an exception
}
// Submit records (perform transactions)
$transaction->commit();
return $this->redirect(['view', 'id' => $model->id]);
} catch (Exception $e) {
// Record rollback (transaction rollback)
$transaction->rollBack();
Yii::$app->session->setFlash('error',$e->getMessage());
return $this->render('create', [
'model' => $model,
'_model'=>$_model,
]);
}
} else {
return $this->render('create', [
'model' => $model,
'_model'=>$_model,
]);
}
}Примечание. Для отката транзакции необходимо создать исключение. 2. Часть представления такая же, как и часть с несколькими моделями, которая здесь опущена.
Резюме и анализ
1. Несколько моделей связаны с моделями, а транзакции связаны с базами данных. 2. Данные проверки нескольких моделей могут быть сохранены только после прохождения всех данных проверки, в противном случае данные будут сохранены с ошибкой; исходные сохраненные данные будут отозваны, если сохраненные данные транзакции столкнутся с исключениями. 3. Нет никакой связи между таблицами с несколькими моделями и таблицами, и должна быть связь между таблицами транзакций и таблицами.
дополнительный
Разница между isset и empty 1. isset ($var) определяет, установлена ли переменная, empty ($var) определяет, пуста ли переменная! Если значение $one не определено, установлено ($one) возвращает значение true и оценивает существование; пустое ($one) оценивает все, оценивает существование и также возвращает значение true. Например, $one определяется как null, значение set ($one) возвращает значение false, а значение empty ($one) возвращает значение true. 2. пустое шире, чем задано, и задано более точно.
Сопутствующая информация
Транзакция составной формы с несколькими моделями В чем польза транзакций Yii?