yajra/laravel-oci8
Oracle database driver for Laravel using the PHP OCI8 extension. Adds an Illuminate/Database-compatible Oracle connection, query builder and schema support, with versioned releases matching Laravel versions and optional PHPStan/Larastan stubs for OCI8-specific DB methods.
composer require yajra/laravel-oci8:^13
config/app.php:
Yajra\Oci8\Oci8ServiceProvider::class,
.env (minimal):
DB_CONNECTION=oracle
DB_HOST=your_oracle_host
DB_PORT=1521
DB_SERVICE_NAME=your_service_name
DB_DATABASE=your_db
DB_USERNAME=your_user
DB_PASSWORD=your_password
php artisan db:show
Run a basic query:
use Illuminate\Support\Facades\DB;
$users = DB::connection('oracle')->select('SELECT * FROM users WHERE active = :active', ['active' => 1]);
Query Building Use Eloquent or Query Builder as usual, but with Oracle-specific syntax:
// Eloquent
User::where('name', 'LIKE', '%John%')->get();
// Query Builder
DB::table('users')
->where('created_at', '>', now()->subDays(7))
->orderBy('name')
->get();
Migrations Leverage Oracle-specific features:
Schema::create('users', function (Blueprint $table) {
$table->id(); // Uses sequence/identity based on Oracle version
$table->string('name');
$table->json('metadata'); // Oracle 12c+ JSON support
$table->timestamps();
});
Dynamic Configuration Override connection params at runtime:
// config/database.php
'oracle' => [
'dynamic' => [App\Services\OracleConfig::class, 'getDynamicConfig'],
],
// App\Services\OracleConfig
public static function getDynamicConfig(&$config) {
$config['username'] = Auth::user()->oracle_username;
}
JSON Support (Oracle 12c+) Query JSON columns:
User::whereJsonContains('metadata->address', ['city' => 'New York'])
->whereJsonLength('metadata->orders', '>', 0)
->get();
Pagination Use standard Laravel pagination:
$users = User::paginate(15); // Works with Oracle-specific count queries
DB_SCHEMA_PREFIX in .env to prefix all tables.config/auth.php:
'providers' => [
'users' => [
'driver' => 'oracle',
'model' => App\Models\User::class,
],
]
.env:
DB_HOST=host1,host2,host3
DB_LOAD_BALANCE=yes
Case Sensitivity
BINARY_CI collation for case-insensitive LIKE:
DB::table('users')->where('name', 'LIKE', '%john%')->get();
Sequence Ownership
prefix_schema in config if needed:
DB_PREFIX_SCHEMA=your_schema
JSON Limitations
Pagination Quirks
ROWNUM for pagination. For older versions, ensure DB_SERVER_VERSION is set correctly.Max Name Length
ORA_MAX_NAME_LEN=128
Trigger Prefixes
Schema::dropIfExists('your_schema_your_table');
DB::connection('oracle')->enableQueryLog();
$results = DB::select('SELECT * FROM users');
dd(DB::getQueryLog());
$version = DB::connection('oracle')->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION);
DB_PREFIX and DB_PREFIX_SCHEMA..env.Custom Grammar
Extend Yajra\Oci8\OracleGrammar for Oracle-specific syntax:
class CustomOracleGrammar extends OracleGrammar {
public function compileWhereJsonContains($expression) {
// Custom JSON logic
}
}
Register in AppServiceProvider:
DB::resolverFor('oracle', function ($connection, $configuration, $name, $query) {
$grammar = new CustomOracleGrammar();
return new OracleConnection($connection, $configuration, $query, $grammar);
});
PHPStan/Larastan Include the extension for static analysis:
// phpstan.neon
includes:
- vendor/yajra/laravel-oci8/extension.neon
Dynamic Configuration
Use the dynamic callback to override connection params per request:
public static function dynamicConfig(&$config) {
if (request()->has('tenant')) {
$config['database'] = "tenant_{$tenant}";
}
}
Full-Text Search
Leverage Oracle’s CONTAINS for full-text queries:
DB::table('articles')
->whereRaw('CONTAINS(content, :search, 1) > 0', ['search' => 'laravel oracle'])
->get();
How can I help you explore Laravel packages today?