The document discusses creating MySQL triggers and stored procedures in a Laravel application. It includes:
1. Creating before, after and delete triggers to handle data changes and logging. The triggers are created using migrations.
2. Defining stored procedures to insert, update, delete and retrieve flower data from the database. These procedures are called from a FlowersController.
3. Displaying the flower data, updated records, and results of calling the stored procedures on a view using Blade templates.
2. Vom adauga trigger-ul before insert: BITrigger care va converti la
majuscule toate inregistrarile, inainte de a fi inserate:
3. php artisan make:migration create_BITrigger_trigger
class CreateBITrigger extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('CREATE TRIGGER BITrigger BEFORE INSERT ON flowers FOR EACH ROW
BEGIN
SET NEW.nume=UPPER(NEW.nume);
END');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP TRIGGER IF EXISTS BITrigger');
}
}
4. Daca dorim sa executam fisierele de migrare separat vom crea care un
director pt fiecare procedura(sau trigger). De ex, cream directorul
BITrigger in /database/migrations si mutam in acesta fisierul de migrari
generat pt procedura insert.
Apoi dam comanda:
php artisan migrate –path=/database/migrations/BITrigger
Astfel se va executa numai un fisier de migrare !!!
Pt a executa toate migrarile vom scrie:
php artisan migrate:refresh
5. php artisan make:migration create_AUTrigger_trigger
class CreateAUTrigger extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('CREATE TRIGGER AUTrigger AFTER UPDATE ON flowers FOR EACH ROW
BEGIN
INSERT INTO flowers_updated(nume, status) VALUES(NEW.nume,"UPDATED");
END');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP TRIGGER IF EXISTS AUTrigger');
}
}
6. • Creati directorul AUTrigger in /database/migrations si mutati in
acesta fisierul de migrari care genereaza trigger-ul AUTrigger.
• Pentru a executa migrarea screti:
php artisan migrate --path=/database/migrations/AUTrigger
8. php artisan make:migration create_AfterDelete_trigger
class CreateAUTrigger extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared(‘CREATE TRIGGER after_Delete AFTER DELETE ON flowers FOR EACH ROW
BEGIN
INSERT INTO flower_update(nume, status, EDTIME) VALUES(OLD.nume,'DELETED', NOW());
END;');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP TRIGGER IF EXISTS after_Delete ');
}
}
9. • Creati directorul ADelete in /database/migrations si mutati in acesta
fisierul de migrari care genereaza trigger-ul AfterDelete.
• Pentru a executa migrarea screti:
php artisan migrate --path=/database/migrations/ADelete
11. • Trigger-ul AuTrigger va fi declansat UpdateFlowers, pe care o vom genera astfel:
php artisan make:migration create_UpdateFlowers_procedure
class CreateUpdateFlowersProcedure extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared("CREATE PROCEDURE UpdateFlowers(IN var_nume varchar(255))
BEGIN
UPDATE flowers SET pret='10' where nume=var_nume;
END");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP PROCEDURE IF EXISTS UpdateFlowers');
}
}
12. • Vom afisa datele din flowers_updated cu procedura GetUpdated().
php artisan make:migration create_GetUpdated_procedure
class CreateGetUpdatedProcedure extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared('CREATE PROCEDURE GetUpdated()
BEGIN
SELECT * FROM flowers_updated;
END');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP PROCEDURE IF EXISTS GetUpdated');
}
}
13. In controller, vom apela procedura astfel:
DB::select('CALL UpdateFlowers("toporasi")');
$flowers3=DB::select('CALL GetUpdated()');
14. • Trigger-ul AfterDelete va fi declansat de procedura DeleteFlowers(), pe care o vom genera astfel:
php artisan make:migration create_DeleteFlowers_procedure
class CreateDeleteFlowersProcedure extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::unprepared("CREATE PROCEDURE DeleteFlowers(IN var_nume varchar(255))
BEGIN
DELETE FROM flowers where nume=var_nume;
END");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::unprepared('DROP PROCEDURE IF EXISTS DeleteFlowers');
}
}
15. php artisan migrate:refresh
Astfel s-au creat toate procedurile si toti triggerii!!!
• In controller, adaugati apelul procedurii:
DB::select('CALL DeleteFlowers("ghiocei")');
16. FlowersController::index
<?php namespace AppHttpControllers;
use AppFlower;
use DB;
class FlowersController extends Controller {
public function index(){
DB::insert("CALL InsertFlowers('lalele', 'mici','rosii','100')");
DB::insert("CALL InsertFlowers('trandafiri', 'mari','rosii','200')");
DB::insert("CALL InsertFlowers('toporasi', 'mici','albi','150')");
DB::insert("CALL InsertFlowers('ghiocei', 'mici','albi','10')");
$flowers1=DB::select('CALL GetFlowers()');
DB::select('CALL UpdateFlowers("toporasi")');
DB::select('CALL DeleteFlowers("ghiocei")');
$flowers2=DB::select('CALL GetFlower("trandafiri")');
$flowers3=DB::select('CALL GetUpdated()');
return view('pages.flowers')->with([
'title'=>'Flowers data',
'flowers1'=> $flowers1,
'flowers2'=>$flowers2,
'flowers3'=>$flowers3]);
}
}
?>
17. Modelul app/Flower.php
<?php namespace App;
use IlluminateDatabaseEloquentModel;
use DB;
class Flower extends Model {
protected $table = 'flowers';
//public $timestamps=false;
}
?>