6
votes

Dossier de base de données Laravel 4 Créer un déclencheur

Lors du processus de création des fichiers de migration de mes applications, j'ai remarqué que Laravel ne prend pas en charge les déclencheurs de base de données! Je suis arrivé avec le fait que j'ai besoin d'exécuter une déclaration de requête pour accomplir cela, mais cela me donne aussi des problèmes. Voici un extrait de code de mon application: xxx pré>

quand Je gère Artisan migrer cela me donne l'erreur suivante: P>

[exception]
SQLSTAT [HY000]: Erreur générale: 2030 Cette commande n'est pas prise en charge dans le protocole de l'instruction préparé (SQL: Créer la trigger utilisateurs_trigger_uuid avant d'insérer sur les utilisateurs de chaque jeu de ligne NEW.UUID = UUID ()) (Bindings: Array ( ))) p> BlockQuote>

Y a-t-il des solutions en dehors de la création de mon propre objet PDO et d'exécuter la requête en dehors de Laravel? Est-ce une exception MySQL ou une exception Laravel? P>

EDIT STRY> P>

À en juger à l'exception, il est clair que des déclarations préparées ne favorisent pas la création de déclencheurs .. Je ne sais pas pourquoi mais j'aimerais avoir une idée. Pour contourner cela, je viens de courir ma propre requête PDO. P>

$default_driver = Config::get('database.default');
$connection_info = Config::get('database.connections.' . $default_driver);
$conn = new PDO('mysql:host=' . $connection_info['host'] . ';dbname=' . $connection_info['database'], $connection_info['username'], $connection_info['password']);
$conn->query('CREATE TRIGGER users_trigger_uuid BEFORE INSERT ON ' . $connection_info['prefix'] . 'users FOR EACH ROW SET NEW.uuid = UUID()');


2 commentaires

tandis que la réponse que vous avez sélectionnée est simple et «éloquente» ne répond pas à une question de l'intégrité de la base de données sérieuse. Vous devriez essayer d'envelopper le code de base de données dans une transaction de sorte que si quelque chose échoue, tout échoue.


Avez-vous eu de la chance avec ça?


3 Réponses :


8
votes

Utiliser dB :: non préparé (), fonctionne comme un charme.


0 commentaires

2
votes

La solution que vous affichez dans votre édition n'est pas correcte. Vous devriez utiliser dB :: non préparé () ou, si vous devez utiliser PDO, ne le faites pas de cette façon . Au lieu de cela, obtenez un objet PDO à partir de la connexion et utilisez-le:

$ pdo = dB :: connexion () -> getpdo ();


0 commentaires

4
votes

Le moyen "propre" de le faire est d'utiliser events de base de données . Lorsque vous créez une nouvelle instance utilisateur, Laravel4 incendie un événement créé .

Les modèles éloquents incendient plusieurs événements, vous permettant de vous connecter à divers Points dans le cycle de vie du modèle en utilisant les méthodes suivantes: Création, Création, mise à jour, mise à jour, sauvegarde, sauvegarde, suppression, supprimée.

Chaque fois qu'un nouvel élément est enregistré pour la première fois, la création et Les événements créés vont tirer. Si un élément n'est pas nouveau et que la méthode de sauvegarde est Appelé, les événements de mise à jour / mis à jour incendient. Dans les deux cas, le Les événements sauver / sauvegardés vont tirer.

Donc, dans votre classe d'utilisateurs, ajoutez un auditeur pour la création de Evénement: xxx

pour générer un UUID En PHP, voir Cette réponse .


2 commentaires

Besoin d'être très prudent en utilisant cette solution. Il n'apparaît pas comme si le code de modification de la base de données est enveloppé dans une transaction. Votre base de données pourrait vous retrouver dans un état terrible si vous n'êtes pas prudent.


La création devrait être atomique; Ici, nous modifions un tuple avant qu'il ne soit réellement insérer éd. Il est toutefois possible de transancer des énoncés en modifiant ou en remplacement "Vendor / laravail / framework / src / illuminate / connexion / connexion .php exécuté () méthode.