esmaill23's avatar

LARAVEL TRIGGER MIGRATION PROBLEM ON TEST ENVIRONMENT

hello i have created a laravel migration as like below. it works on migrate on mysql in product env but not work on sqlite in testing env . thank you :

public function up()
    {
        \Illuminate\Support\Facades\DB::unprepared('CREATE TRIGGER after_insert_price AFTER INSERT ON `movie_prices` FOR EACH ROW
            BEGIN
                IF((SELECT status from agreements where id = NEW.agreement_id) != 4 and (select sum(datediff(end_time,start_time)+1) from movie_prices where agreement_id = NEW.agreement_id) = (select datediff(end_time,start_time)+1 from agreements where id = NEW.agreement_id))
                THEN
                    UPDATE agreements SET status=2 where id = NEW.agreement_id;
                ELSEIF((SELECT status from agreements where id = NEW.agreement_id) != 4)
                THEN
                    UPDATE agreements SET status=3 where id = NEW.agreement_id;
                END IF;
            END');

        \Illuminate\Support\Facades\DB::unprepared('CREATE TRIGGER after_update_price AFTER UPDATE ON `movie_prices` FOR EACH ROW
            BEGIN
                IF((SELECT status from agreements where id = NEW.agreement_id) != 4 and (select sum(datediff(end_time,start_time)+1) from movie_prices where agreement_id = NEW.agreement_id) = (select datediff(end_time,start_time)+1 from agreements where id = NEW.agreement_id))
                THEN
                    UPDATE agreements SET status=2 where id = NEW.agreement_id;
                ELSEIF ((SELECT status from agreements where id = NEW.agreement_id) != 4)
                THEN
                    UPDATE agreements SET status=3 where id = NEW.agreement_id;
                END IF;
            END');

        \Illuminate\Support\Facades\DB::unprepared('CREATE TRIGGER after_delete_price AFTER DELETE ON `movie_prices` FOR EACH ROW
            BEGIN
                IF((SELECT status from agreements where id = OLD.agreement_id) != 4 AND (SELECT COUNT(*) FROM `movie_prices` WHERE agreement_id = OLD.agreement_id) = 0)
                THEN
                    UPDATE agreements SET status=1 where id = OLD.agreement_id;
                ELSEIF((SELECT status from agreements where id = OLD.agreement_id) != 4 and (select sum(datediff(end_time,start_time)+1) from movie_prices where agreement_id = OLD.agreement_id) = (select datediff(end_time,start_time)+1 from agreements where id = OLD.agreement_id))
                THEN
                    UPDATE agreements SET status=2 where id = OLD.agreement_id;
                ELSEIF ((SELECT status from agreements where id = OLD.agreement_id) != 4)
                THEN
                    UPDATE agreements SET status=3 where id = OLD.agreement_id;
                END IF;
            END');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        \Illuminate\Support\Facades\DB::unprepared('DROP TRIGGER `after_insert_price`');
        \Illuminate\Support\Facades\DB::unprepared('DROP TRIGGER `after_update_price`');
        \Illuminate\Support\Facades\DB::unprepared('DROP TRIGGER `after_delete_price`');
    }

raise this error on migrate on test env

Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 near "IF": syntax error (SQL: CREATE TRIGGER after_insert_price AFTER INSERT ON `movie_prices` FOR EACH ROW
            BEGIN
                IF((SELECT status from agreements where id = NEW.agreement_id) != 4 and (select sum(datediff(end_time,start_time)+1) from movie_prices where agreement_id = NEW.agreement_id) = (select datediff(end_time,start_time)+1 from agreements where id = NEW.agreement_id))
                THEN
                    UPDATE agreements SET status=2 where id = NEW.agreement_id;
                ELSEIF((SELECT status from agreements where id = NEW.agreement_id) != 4)
                THEN
                    UPDATE agreements SET status=3 where id = NEW.agreement_id;
                END IF;
            END)

0 likes
5 replies
Tray2's avatar

I haven't used plsql in MySQL but I use it daily with Oracle Databases.

And I think you need to do this

DECLARE
    vStatus agreements.status%TYPE;
BEGIN
SELECT status
INTO vStatus
FROM agreements 
WHERE id = NEW.agreement_id;

//More code here
    
END;

I believe you need to select all the value into vaiables first then compare them

1 like
esmaill23's avatar

MY CODE WORK ON MYSQL BUT NOT WORK ON SQLITE

esmaill23's avatar

i saw this page . but what can i do ? my main environment database is mysql and my test environment database is sqlite. this is problem.

Please or to participate in this conversation.