ホームページ >PHPフレームワーク >Laravel >laravelはどのデータベースをサポートしていますか?

laravelはどのデータベースをサポートしていますか?

青灯夜游
青灯夜游オリジナル
2022-02-14 15:38:172601ブラウズ

laravel は 4 つのデータベースをサポートします: 1. MySQL、リレーショナル データベース管理システム; 2. PostgreSQL、「オブジェクト リレーショナル」データベース管理システム; 3. SQLite、軽量リレーショナル データベース管理システム; 4. SQL Server 、リレーショナル データベース管理システム。

laravelはどのデータベースをサポートしていますか?

このチュートリアルの動作環境: Windows 7 システム、Laravel 6 バージョン、Dell G3 コンピューター。

Laravel は、ネイティブ SQL クエリ、流暢なクエリ ビルダー、Eloquent ORM をサポートしており、これらの操作により、さまざまなデータベース バックエンドでのデータベースとの対話が非常に簡単になります。

現在、Laravel は次の 4 つのデータベースをサポートしています:

  • MySQL 5.7: スウェーデンの MySQL AB 社によって開発されたリレーショナル データベース管理システムであり、オラクル社の製品。

  • PostgreSQL 9.6: 非常に完全な機能を備えたフリー ソフトウェア オブジェクト リレーショナル データベース管理システム。これは、米国省によって開発された POSTGRES バージョン 4.2 に基づくオブジェクト リレーショナル データベース管理システムです。カリフォルニア大学のコンピューター サイエンス、データベース管理システム。

  • SQLite 3.8.8: 比較的小さな C ライブラリに含まれる軽量データベース、ACID 準拠のリレーショナル データベース管理システム。

  • SQL Server 2017: Microsoft によって発売されたリレーショナル データベース管理システム

構成

データベース構成ファイルは config/database.php ファイルにあります。このファイルですべてのデータベース接続構成を定義し、デフォルトのデータベース接続を指定できます。このファイルには、Laravel でサポートされているほとんどのデータベース構成の例が含まれています。

デフォルトでは、Laravel の環境構成例では Laravel Homestead が使用されます (Laravel Homestead は、ローカルで Laravel を使用して簡単に開発できる小さな仮想マシンです)。ローカル データベースのニーズに応じて、この構成ファイルを変更できます。

SQLite 構成

create コマンド (touch database/database.sqlite など) を使用して新しい SQLite データベースを作成した後、データベースへの絶対パスを指定し、この新しく作成されたデータベースを指すように環境変数を構成します:

DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite

SQLite 接続の外部キー制約を有効にするには、DB_foreign_KEYS 環境変数を true に設定する必要があります:

DB_FOREIGN_KEYS=true

URL による構成

通常、データベース接続では、hostdatabaseusername などの複数の構成値が使用されます。 、パスワードなど。これらの各構成値には、対応する環境変数があります。これは、運用サーバーでデータベース接続情報を構成するときに管理する必要がある環境変数が複数あることを意味します。

一部のマネージド データベース プロバイダー (Heraku など) は、データベースのすべての接続情報を単一の文字列に含む単一のデータベース "URL" を提供します。サンプルデータベースの URL は次のようになります:

mysql://root:password@127.0.0.1/forge?charset=UTF-8
这些 URLs 通常遵循标准模式约定:
driver://username:password@host:port/database?options

便宜上、Laravel は複数の構成オプションを使用してデータベースを構成する代わりにこれらの URL をサポートしています。 url (または対応する DATABASE_URL 環境変数) 構成オプションが存在する場合、そのオプションはデータベース接続および資格情報の抽出に使用されます。

読み取りと書き込みの分離

SELECT ステートメントで 1 つのデータベース接続を使用し、INSERT、UPDATE、および DELETE ステートメントで別のデータベース接続を使用したい場合があります。 Laravel では、ネイティブ クエリ、クエリ ビルダー、または Eloquent ORM のいずれを使用する場合でも、簡単に実装できます。

読み取りと書き込みの分離がどのように構成されているかを理解するために、まず例を見てみましょう:

'mysql' => [
    'read' => [
        'host' => [
            '192.168.1.1',
            '196.168.1.2',
        ],
    ],
    'write' => [
        'host' => [
            '196.168.1.3',
        ],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
],

上の例では、3 つのキーが構成配列に追加されていることに注意してください。読み書き、スティッキー。読み取りと書き込みの両方に、キー ホストを含​​む配列が含まれます。読み取りおよび書き込みの他のデータベース オプションは、キー mysql を持つ配列内にあります。

メイン配列の構成を書き換える場合は、読み取り配列と書き込み配列を変更するだけです。したがって、この例では、192.168.1.1 と 192.168.1.2 は「読み取り」としてホストに接続し、192.168.1.3 は「書き込み」としてホストに接続します。これら 2 つの接続は、データベース資格情報 (ユーザー名/パスワード)、プレフィックス、文字エンコーディングなど、mysql 配列のさまざまな構成を共有します。

sticky オプション

sticky は、現在の要求サイクル中にデータベースに書き込まれたレコードをすぐに読み取るために使用されるオプションの値です。スティッキー オプションが有効で、現在のリクエスト サイクル中に「書き込み」操作が実行される場合、すべての「読み取り」操作は「書き込み」接続を使用します。これにより、同じリクエストサイクルで書き込まれたデータを即座に読み出すことができるため、マスタとスレーブの同期遅延によるデータ不整合の問題が回避されます。ただし、これを有効にするかどうかは、アプリケーションのニーズによって異なります。

複数のデータベース接続の使用

複数のデータベース接続を使用する場合、DB Facade ファサードの接続メソッドを通じて各接続にアクセスできます。接続メソッドに渡されるパラメータ名は、config/database.php 設定ファイルの接続配列の値である必要があります:

$users = DB::connection('foo')->select(...);

接続インスタンスで getPdo メソッドを使用して、基になる PDO インスタンスにアクセスすることもできます。 :

$pdo = DB::connection()->getPdo();

执行原生 SQL 查询

一旦配置好数据库连接后,便可以使用 DB facade 门面运行查询。DB facade 为每种类型的查询提供了相应的方法:select,update,insert,delete 和 statement。

执行 Select 查询

你可以使用 DB Facade 的 select 方法来运行基础的查询语句:

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
    /**
     * 显示应用程序中所有用户的列表
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::select(&#39;select * from users where active = ?&#39;, [1]);
        return view(&#39;user.index&#39;, [&#39;users&#39; => $users]);
    }
}

传递给 select 方法的第一个参数就是一个原生的 SQL 查询,而第二个参数则是需要绑定到查询中的参数值。通常,这些值用于约束 where 语句。参数绑定可以防止 SQL 注入。

select 方法将始终返回一个 array 数组,数组中的每个结果都是一个 stdClass 对象,可以像下面这样访问结果中的数值:

foreach ($users as $user) {
    echo $user->name;
}

使用命名绑定

除了使用 ? 表示参数绑定外,你还可以使用命名绑定的形式来执行一个查询:

$results = DB::select(&#39;select * from users where id = :id&#39;, [&#39;id&#39; => 1]);

执行 Insert 语句

你可以使用 DB Facade 的 insert 方法来执行 insert 语句。与 select 方法一样,该方法将原生 SQL 查询作为其第一个参数,并将绑定的数据作为第二个参数:

DB::insert(&#39;insert into users (id, name) values (?, ?)&#39;, [1, &#39;Dayle&#39;]);

执行 Update 语句

update 方法用于更新数据库中现有的记录。该方法返回该执行语句影响的行数:

$affected = DB::update(&#39;update users set votes = 100 where name = ?&#39;, [&#39;John&#39;]);

执行 Delete 语句

delete 方法用于从数据库中删除记录。与 update 方法一样,返回受该执行语句影响的行数:

$deleted = DB::delete(&#39;delete from users&#39;);

执行普通语句

有些数据库语句不会有任何返回值。对于这些语句,你可以使用 DB Facade 的 statement 方法来运行:

DB::statement(&#39;drop table users&#39;);

运行未预处理的语句

有时你可能希望在不绑定任何值的情况下运行语句。对于这些类型的操作,可以使用 DB Facade 的 unprepared 方法:

DB::unprepared(&#39;update users set votes = 100 where name = "Dries"&#39;);

请注意,这些语句不会像上面的语句那样绑定值。它们可以打开你的应用程序进行 SQL 注入,应该非常小心地使用。

隐式提交

在事务中使用 DB 外观的 statement 和 unprepared 方法时,必须小心避免导致 [隐式提交] 的语句 (https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 这些语句将导致数据库引擎间接提交整个事务,从而使 Laravel 不知道数据库的事务级别。这种语句的一个例子是创建数据库表:

DB::unprepared(&#39;create table a (col varchar(1) null)&#39;);

请参考 MySQL 手册中的触发隐式提交的所有语句列表。

监听查询事件

如果你想监控程序执行的每一个 SQL 查询,你可以使用 listen 方法。这个方法对于记录查询或调试非常有用。你可以在 服务提供器 中注册你的查询监听器:

<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    /**
     * 注册所有应用的服务
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * 引导所有应用的服务
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }
}

数据库事务

你可以使用 DB facade 的 transaction 方法在数据库事务中运行一组操作。如果事务的闭包 Closure 中出现一个异常,事务将会回滚。如果事务闭包 Closure 执行成功,事务将自动提交。一旦你使用了 transaction, 就不必担心手动回滚或提交的问题:

DB::transaction(function () {
    DB::table(&#39;users&#39;)->update([&#39;votes&#39; => 1]);
    DB::table(&#39;posts&#39;)->delete();
});

处理死锁

transaction 方法接受一个可选的第二个参数,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常:

DB::transaction(function () {
    DB::table(&#39;users&#39;)->update([&#39;votes&#39; => 1]);
    DB::table(&#39;posts&#39;)->delete();
}, 5);

手动使用事务

如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用 DB Facade 的 beginTransaction 方法:

DB::beginTransaction();

你可以使用 rollBack 方法回滚事务:

DB::rollBack();

最后,你可以使用 commit 方法提交事务:

DB::commit();

技巧:DB facade 的事务方法同样适用于 查询构造器 和 Eloquent ORM。

连接到数据库 CLI

如果要连接到数据库的 CLI,可以使用 db Artisan 命令:

php artisan db

如果需要,可以指定数据库连接名称以连接到不是默认连接的数据库连接:

php artisan db mysql

【相关推荐:laravel视频教程

以上がlaravelはどのデータベースをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。