Les transactions ORM éloquentes de Laravel
L'Orme éloquent est assez agréable, bien que je me demande s'il y a un moyen facile de configurer des transactions MySQL en utilisant innoDB de la même manière que PDO, ou si je devrais étendre l'ORM pour rendre cela possible?
7 réponses
Vous pouvez faire ceci:
DB::transaction(function() {
//
});
Tout ce qui se trouve à l'intérieur de la fermeture est exécuté dans le cadre d'une transaction. Si une exception se produit, il annulera automatiquement.
si vous n'aimez pas les fonctions anonymes:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
mise à jour : pour laravel 4, l'objet pdo
n'est plus public donc:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
si vous voulez utiliser Eloquent, vous pouvez aussi utiliser ce
c'est juste un exemple de code de mon projet
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
si vous voulez éviter les fermetures, et heureux d'utiliser les façades, ce qui suit garde les choses belles et propres:
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
si une déclaration échoue, commit ne sera jamais lancé, et la transaction ne sera pas traiter.
pour une raison quelconque, il est assez difficile de trouver cette information n'importe où, donc j'ai décidé de la poster ici, car mon problème, bien que lié à des transactions éloquentes, était exactement changer cela.
après avoir lu THIS stackoverflow answer, j'ai réalisé que mes tables de base de données utilisaient MyISAM au lieu D'InnoDB.
pour que les transactions fonctionnent sur Laravel (ou n'importe où ailleurs comme il semble), il est nécessaire que vos tables sont définis pour utiliser InnoDB
pourquoi?
, Citant MySQL les Transactions et les Opérations Atomiques docs ( ici ):
MySQL Server (version 3.23-max et toutes les versions 4.0 et supérieures) prend en charge les transactions avec les moteurs de stockage Transactionnels InnoDB et BDB. InnoDB fournit une conformité complète à L'acide. Voir Chapitre 14, Moteurs De Stockage. Pour plus d'informations sur InnoDB différences par rapport à la norme SQL en ce qui concerne le traitement des erreurs de transaction, voir la Section 14.2.11, "traitement des erreurs InnoDB".
les autres moteurs de stockage non transactionnel dans MySQL Server (tels que MyISAM) suivent un paradigme différent pour l'intégrité des données appelé "opérations atomiques."En termes transactionnels, les tables MyISAM fonctionnent toujours en mode autocommit = 1. Les opérations atomiques offrent souvent une intégrité comparable avec des performances plus élevées.
parce que MySQL Server prend en charge les deux paradigmes, vous pouvez décider si vos applications sont mieux servies par la vitesse des opérations atomiques ou l'utilisation de fonctionnalités transactionnelles. Ce choix peut être fait sur une table par table.
je suis sûr que vous n'êtes pas à la recherche d'une solution de fermeture, essayez ceci pour une solution plus compacte
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
si une exception se produit, la transaction sera automatiquement annulée.
Laravel de transactions de Base format
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}