kkszymanowski / laravel-6-odbc

Laravel 6的ODBC连接器

6.0.6 2022-10-24 10:59 UTC

This package is auto-updated.

Last update: 2024-08-24 14:53:01 UTC


README

此包受到tck/odbc的启发,但进行了简化、现代化,并使其与Laravel 6、7和8兼容。

安装

composer require kkszymanowski/laravel-6-odbc

config/database.php中添加数据库配置,例如

'connections' => [
    'myOdbcConnection' => [
        'driver'   => 'odbc',
        'dsn'      => env('DB_ODBC_CONNECTION_STRING'),
        'host'     => env('DB_ODBC_HOST'),
        'database' => env('DB_ODBC_DATABASE'),
        'username' => env('DB_ODBC_USERNAME'),
        'password' => env('DB_ODBC_PASSWORD'),
    ],

    // ...
],

将配置中引用的环境变量添加到您的.env文件中,例如

DB_ODBC_CONNECTION_STRING="odbc:DRIVER=Pervasive;ServerName=192.168.0.1;DBQ=DATABASE;UID=User;PWD=Password"
DB_ODBC_HOST=192.168.0.1
DB_ODBC_DATABASE=DATABASE
DB_ODBC_USERNAME=User
DB_ODBC_PASSWORD=Password

如果您想自定义ODBC连接中使用的模式语法、查询语法或后处理器,可以通过分别扩展\Odbc\OdbcSchemaGrammar\Odbc\OdbcQueryGrammar\Odbc\OdbcProcessor来实现。然后添加以下配置条目

'database.connections.odbc.grammar.query'
'database.connections.odbc.grammar.schema'
'database.connections.odbc.processor'

例如在config/database.php中添加

'connections' => [
    // ...

    'odbc' => [
        'grammar' => [
            'query' => \App\Grammars\CustomQueryGrammar::class,
            'schema' => \App\Grammars\CustomSchemaGrammar::class,
        ],
        'processor' => \App\Processors\CustomProcessor::class,
    ],

    // ...
],

更常见的情况之一是自定义分页中使用的compileLimit()方法和跳过方法的skip()。您可以通过以下方式实现

use Illuminate\Database\Query\Builder;
use Odbc\OdbcQueryGrammar;

class CustomQueryGrammar extends OdbcQueryGrammar
{
    /**
     * Compile the "limit" portions of the query.
     *
     * @param Builder $query
     * @param int     $limit
     *
     * @return string
     */
    protected function compileLimit(Builder $query, $limit)
    {
        return 'select top ' . (int) $limit;
    }
}

请注意,自定义处理器在运行原始查询时不会使用,例如$connection->select('SELECT * FROM USERS')。要使用它,您必须使用Eloquent查询构建器构建查询,例如

User::get();
DB::connection('myOdbcConnection')->table('USERS')->get(); 

使用

使用Eloquent

要覆盖默认数据库连接,请在您的Eloquent模型中定义$connection名称

/**
 * The connection name for the model.
 *
 * @var string
 */
protected $connection = 'myOdbcConnection';

定义连接名称后,执行所有标准Eloquent操作

$user = User::where('id', 1)->get();
$users = User::all();

非Eloquent

您也可以不使用Eloquent模型执行查询。确保如果您不是使用默认连接,则指定连接名称,例如

$user = DB::connection('myOdbcConnection')->select('SELECT * FROM USERS WHERE id = :id', ['id' => 1]);
$users = DB::connection('myOdbcConnection')->table('USERS')->where('id', 1)->get();

如果您正在运行原始查询,请确保尽可能使用参数绑定,以避免SQL注入漏洞。