![]()
WARNING You're browsing the documentation for an upcoming version of Laravel Oci8. The documentation and features of this release are subject to change.
Oracle Triggers
Oracle triggers are database objects that automatically execute in response to certain events on a table. Laravel-OCI8 provides a simple API for managing triggers.
Accessing the Trigger Manager
$trigger = DB::getTrigger();
Available Methods
Create an Auto-Increment Trigger
Creates a trigger that automatically assigns the next sequence value to a column on insert:
$trigger->autoIncrement($table, $column, $triggerName, $sequenceName);
Example:
$trigger->autoIncrement( 'users', // Table name 'id', // Column to auto-increment 'users_id_trg', // Trigger name 'users_id_seq' // Sequence name);
This creates a trigger similar to:
CREATE OR REPLACE TRIGGER users_id_trgBEFORE INSERT ON usersFOR EACH ROWBEGIN SELECT users_id_seq.NEXTVAL INTO :NEW.id FROM DUAL;END;
Drop a Trigger
$trigger->drop($triggerName);
Example:
$trigger->drop('users_id_trg');
Complete Example: Setting Up Auto-Increment
Here's a complete example of manually creating the sequence and trigger:
Step 1: Create the Sequence
$sequence = DB::getSequence();$sequence->create('posts_id_seq', $start = 1);
Step 2: Create the Trigger
$trigger = DB::getTrigger();$trigger->autoIncrement('posts', 'id', 'posts_id_trg', 'posts_id_seq');
Step 3: Use the Table
Now when you insert records, the ID is automatically generated:
DB::connection('oracle')->table('posts')->insert([ 'title' => 'My First Post', 'content' => 'Post content here...',]); // Or with Eloquent$post = new Post();$post->title = 'My First Post';$post->content = 'Post content here...';$post->save(); // $post->id is now automatically set
Manual Trigger Creation
For more complex trigger requirements, create them manually in a migration:
<?php use Illuminate\Database\Migrations\Migration;use Illuminate\Support\Facades\DB; class CreatePostsTrigger extends Migration{ /** * Run the migrations. */ public function up(): void { $sql = " CREATE OR REPLACE TRIGGER posts_id_trg BEFORE INSERT ON posts FOR EACH ROW WHEN (NEW.id IS NULL) BEGIN SELECT posts_id_seq.NEXTVAL INTO :NEW.id FROM DUAL; END; "; DB::connection()->getPdo()->exec($sql); } /** * Reverse the migrations. */ public function down(): void { DB::connection()->getPdo()->exec("DROP TRIGGER posts_id_trg"); }}
Trigger Events
Oracle triggers can fire at different times:
| Timing | Description |
|---|---|
BEFORE |
Executes before the triggering event |
AFTER |
Executes after the triggering event |
INSTEAD OF |
Replaces the triggering event (for views) |
Trigger Levels
| Level | Description |
|---|---|
FOR EACH ROW |
Row-level trigger - executes once per affected row |
| Statement-level | Executes once per statement |
See Also
- Oracle Sequence - Sequence management
- Auto-Increment Support - Automatic setup with migrations
- Oracle Eloquent Model - Using sequences with Eloquent