>  기사  >  PHP 프레임워크  >  laravel은 어떤 데이터베이스를 지원합니까?

laravel은 어떤 데이터베이스를 지원합니까?

青灯夜游
青灯夜游원래의
2022-02-14 15:38:172577검색

Laravel은 4가지 데이터베이스를 지원합니다: 1. 관계형 데이터베이스 관리 시스템인 MySQL 2. "객체 관계형" 데이터베이스 관리 시스템인 PostgreSQL 3. 경량 관계형 데이터베이스 관리 시스템인 SQLite 데이터베이스 관리 시스템.

laravel은 어떤 데이터베이스를 지원합니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, Laravel 6 버전, Dell G3 컴퓨터.

Laravel은 기본 SQL 쿼리, Fluent 쿼리 빌더 및 Eloquent ORM을 지원하므로 다양한 데이터베이스 백엔드에서 데이터베이스와 매우 간단하게 상호 작용할 수 있습니다.

현재 Laravel은 다음 네 가지 데이터베이스를 지원합니다:

  • MySQL 5.7+: 스웨덴 MySQL AB 회사가 개발한 관계형 데이터베이스 관리 시스템이자 Oracle 제품입니다.

  • PostgreSQL 9.6+: 매우 완벽한 기능을 갖춘 무료 소프트웨어 객체 관계형 데이터베이스 관리 시스템입니다. 이는 캘리포니아 대학교 컴퓨터 과학과에서 개발한 POSTGRES 버전 4.2를 기반으로 하는 객체 관계형 데이터베이스 관리 시스템입니다. .

  • SQLite 3.8.8+: 상대적으로 작은 C 라이브러리에 포함된 ACID 호환 관계형 데이터베이스 관리 시스템인 경량 데이터베이스입니다.

  • SQL Server 2017+: Microsoft에서 출시한 관계형 데이터베이스 관리 시스템

구성

데이터베이스 구성 파일은 config/database.php 파일에 있습니다. 이 파일에서 모든 데이터베이스를 정의할 수 있습니다. 기본 데이터베이스 연결을 지정합니다. 이 파일은 Laravel이 지원하는 대부분의 데이터베이스 구성의 예를 제공합니다.

기본적으로 Laravel의 샘플 환경 구성은 Laravel Homestead(로컬에서 Laravel을 사용하여 쉽게 개발할 수 있는 작은 가상 머신)를 사용합니다. 로컬 데이터베이스의 필요에 따라 이 구성 파일을 수정할 수 있습니다.

SQLite 구성

touch Database/database.sqlite와 같은 생성 명령을 사용하여 새 SQLite 데이터베이스를 생성한 후 데이터베이스의 절대 경로를 사용하여 환경 변수가 가리키도록 구성할 수 있습니다. 새로 생성된 데이터베이스:touch database/database.sqlite 一类的创建命令,创建了一个新的 SQLite 数据库之后,你就可以使用数据库的绝对路径,配置环境变量来指向这个新创建的数据库:

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

若要为 SQLite 连接启用外键约束,应将 DB_foreign_KEYS 环境变量设置为 true:

DB_FOREIGN_KEYS=true

URLs 形式配置

通常,数据库连接使用多个配置值,例如 hostdatabaseusernamepassword

mysql://root:password@127.0.0.1/forge?charset=UTF-8

SQLite 연결에 대한 외래 키 제약 조건을 활성화하려면 DB_foreign_KEYS 환경 변수를 true로 설정해야 합니다.

这些 URLs 通常遵循标准模式约定:
driver://username:password@host:port/database?options

URLs form 구성

일반적으로 데이터베이스 연결은 여러 구성 값을 사용합니다. 예: 호스트, 데이터베이스, 사용자 이름, 비밀번호 등 이러한 각 구성 값에는 해당 환경 변수가 있습니다. 이는 프로덕션 서버에서 데이터베이스 연결 정보를 구성할 때 관리해야 할 환경 변수가 여러 개 있다는 것을 의미합니다.

Heroku와 같은 일부 관리형 데이터베이스 제공업체는 데이터베이스에 대한 모든 연결 정보를 단일 문자열로 포함하는 단일 데이터베이스 "URL"을 제공합니다. 샘플 데이터베이스 URL은 다음과 같습니다:

'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' => '',
],
$users = DB::connection('foo')->select(...);

편의를 위해 Laravel은 여러 구성 옵션을 사용하여 데이터베이스를 구성하는 대신 이러한 URL을 지원합니다. url(또는 해당 DATABASE_URL 환경 변수) 구성 옵션이 있는 경우 해당 옵션은 데이터베이스 연결 및 자격 증명 정보를 추출하는 데 사용됩니다.

읽기 및 쓰기 분리

때때로 SELECT 문이 하나의 데이터베이스 연결을 사용하고 INSERT, UPDATE 및 DELETE 문이 다른 데이터베이스 연결을 사용하기를 원할 때가 있습니다. Laravel에서는 기본 쿼리, 쿼리 빌더 또는 Eloquent ORM을 사용하여 쉽게 구현할 수 있습니다.

읽기-쓰기 분리가 어떻게 구성되는지 이해하기 위해 먼저 예를 살펴보겠습니다.

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

위 예에서는 구성 배열에 읽기, 쓰기, 고정이라는 세 개의 키가 추가되었습니다. 읽기와 쓰기 모두 키 호스트가 있는 배열을 포함합니다. 읽기 및 쓰기에 대한 다른 데이터베이스 옵션은 mysql 키가 있는 배열에 있습니다.

기본 어레이의 구성을 재정의하려면 읽기 및 쓰기 어레이를 수정하면 됩니다. 따라서 이 예에서 192.168.1.1 및 192.168.1.2는 "읽기"로 호스트에 연결되고, 192.168.1.3은 "쓰기"로 호스트에 연결됩니다. 이 두 연결은 데이터베이스 자격 증명(사용자 이름/비밀번호), 접두사, 문자 인코딩 등과 같은 mysql 배열의 다양한 구성을 공유합니다.

sticky 옵션 ​​

sticky는 현재 요청 주기 동안 데이터베이스에 기록된 레코드를 즉시 읽는 데 사용되는 선택적 값입니다. 고정 옵션이 활성화되고 현재 요청 주기 동안 "쓰기" 작업이 수행되는 경우 모든 "읽기" 작업은 "쓰기" 연결을 사용합니다. 이를 통해 동일한 요청 주기에 기록된 데이터를 즉시 읽을 수 있으므로 마스터-슬레이브 동기화 지연으로 인해 발생하는 데이터 불일치 문제를 방지할 수 있습니다. 그러나 활성화 여부는 애플리케이션의 요구 사항에 따라 다릅니다.

🎜다중 데이터베이스 연결 사용🎜🎜🎜다중 데이터베이스 연결을 사용할 경우 DB Facade Facade의 연결 방식을 통해 각 연결에 접근할 수 있습니다. 연결 메소드에 전달된 매개변수 이름은 config/database.php 구성 파일의 연결 배열에 있는 값이어야 합니다: 🎜
<?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]);
    }
}
🎜 연결 인스턴스에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:라라벨 큐란?다음 기사:라라벨 큐란?