Rumah  >  Artikel  >  rangka kerja php  >  Pangkalan data apa yang disokong oleh laravel?

Pangkalan data apa yang disokong oleh laravel?

青灯夜游
青灯夜游asal
2022-02-14 15:38:172567semak imbas

Laravel menyokong empat pangkalan data: 1. MySQL, sistem pengurusan pangkalan data hubungan 2. PostgreSQL, sistem pengurusan pangkalan data "hubungan objek" 3. SQLite, sistem Pengurusan pangkalan data relasi yang ringan; , sistem pengurusan pangkalan data hubungan.

Pangkalan data apa yang disokong oleh laravel?

Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Laravel 6, komputer Dell G3.

Laravel menyokong pertanyaan SQL asli, pembina pertanyaan yang fasih dan Eloquent ORM Operasi ini menjadikan interaksi dengan pangkalan data sangat mudah dalam pelbagai bahagian belakang pangkalan data.

Pada masa ini Laravel menyokong empat pangkalan data berikut:

  • MySQL 5.7: sistem pengurusan pangkalan data hubungan yang dibangunkan oleh syarikat MySQL AB Sweden dan dimiliki oleh Produk Oracle.

  • PostgreSQL 9.6: Sistem pengurusan pangkalan data perhubungan objek perisian percuma dengan ciri yang sangat lengkap Ia adalah sistem pengurusan pangkalan data perhubungan objek berdasarkan POSTGRES, versi 4.2, yang dibangunkan oleh Jabatan. Sains Komputer di sistem pengurusan pangkalan data Universiti California.

  • SQLite 3.8.8: Pangkalan data ringan, sistem pengurusan pangkalan data hubungan yang mematuhi ACID, yang terkandung dalam perpustakaan C yang agak kecil.

  • SQL Server 2017: Sistem pengurusan pangkalan data perhubungan yang dilancarkan oleh Microsoft

Konfigurasi

Pangkalan data fail konfigurasi berada dalam fail config/database.php Anda boleh menentukan semua konfigurasi sambungan pangkalan data dalam fail ini dan menentukan sambungan pangkalan data lalai. Fail ini menyediakan contoh kebanyakan konfigurasi pangkalan data yang disokong oleh Laravel.

Secara lalai, konfigurasi persekitaran sampel Laravel menggunakan Laravel Homestead (ia adalah mesin maya kecil yang membolehkan anda membangunkan dengan mudah menggunakan Laravel secara tempatan). Anda boleh mengubah suai fail konfigurasi ini mengikut keperluan pangkalan data tempatan.

Konfigurasi SQLite

Selepas mencipta pangkalan data SQLite baharu menggunakan arahan penciptaan seperti touch database/database.sqlite, anda boleh menggunakan laluan mutlak pangkalan data untuk mengkonfigurasi pembolehubah persekitaran kepada tunjuk ke pangkalan data yang baru dibuat ini:

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

Untuk mendayakan kekangan kunci asing untuk sambungan SQLite, pembolehubah persekitaran DB_foreign_KEYS hendaklah ditetapkan kepada benar:

DB_FOREIGN_KEYS=true

konfigurasi bentuk URL

Biasanya, sambungan pangkalan data menggunakan berbilang nilai konfigurasi, seperti host, database, username, password, dsb. Setiap nilai konfigurasi ini mempunyai pembolehubah persekitaran yang sepadan. Ini bermakna terdapat berbilang pembolehubah persekitaran yang perlu diuruskan semasa mengkonfigurasi maklumat sambungan pangkalan data pada pelayan pengeluaran.

Sesetengah pembekal pangkalan data terurus (seperti Heroku) menyediakan satu pangkalan data "URL" yang mengandungi semua maklumat sambungan untuk pangkalan data dalam satu rentetan. Contoh URL pangkalan data mungkin kelihatan seperti ini:

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

Untuk kemudahan, Laravel menyokong URL ini sebagai alternatif untuk mengkonfigurasi pangkalan data menggunakan berbilang pilihan konfigurasi. Jika pilihan konfigurasi url (atau pembolehubah persekitaran DATABASE_URL yang sepadan) ada, pilihan itu akan digunakan untuk mengekstrak sambungan pangkalan data dan maklumat kelayakan.

Baca dan tulis pemisahan

Kadangkala anda mahu penyataan SELECT menggunakan satu sambungan pangkalan data dan penyataan INSERT, UPDATE dan DELETE untuk menggunakan sambungan pangkalan data yang lain. Dalam Laravel, sama ada anda menggunakan pertanyaan asli, pembina pertanyaan atau ORM Fasih, anda boleh melaksanakannya dengan mudah.

Untuk memahami cara pemisahan baca-tulis dikonfigurasikan, mari kita lihat contoh dahulu:

'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' => '',
],

Perhatikan bahawa dalam contoh di atas, tiga kekunci ditambahkan pada tatasusunan konfigurasi, masing-masing. Ia membaca, menulis dan melekat. Kedua-dua baca dan tulis mengandungi tatasusunan dengan hos utama. Pilihan pangkalan data lain untuk membaca dan menulis adalah dalam tatasusunan dengan kunci mysql.

Jika anda ingin mengatasi konfigurasi dalam tatasusunan utama, cuma ubah suai tatasusunan baca dan tulis. Jadi, dalam contoh ini: 192.168.1.1 dan 192.168.1.2 akan menyambung kepada hos sebagai "baca", manakala 192.168.1.3 akan menyambung kepada hos sebagai "tulis". Kedua-dua sambungan ini akan berkongsi pelbagai konfigurasi tatasusunan mysql, seperti kelayakan pangkalan data (nama pengguna/kata laluan), awalan, pengekodan aksara, dsb.

pilihan melekit

melekit ialah nilai pilihan yang digunakan untuk segera membaca rekod yang telah ditulis ke pangkalan data semasa kitaran permintaan semasa. Jika pilihan melekit didayakan dan operasi "tulis" dilakukan semasa kitaran permintaan semasa, sebarang operasi "baca" akan menggunakan sambungan "tulis". Ini memastikan bahawa data yang ditulis dalam kitaran permintaan yang sama boleh dibaca serta-merta, dengan itu mengelakkan masalah ketidakkonsistenan data yang disebabkan oleh kelewatan penyegerakan tuan-hamba. Walau bagaimanapun, sama ada untuk membolehkannya bergantung pada keperluan aplikasi.

Menggunakan berbilang sambungan pangkalan data

Apabila menggunakan berbilang sambungan pangkalan data, anda boleh mengakses setiap sambungan melalui kaedah sambungan fasad DB Facade. Nama parameter yang dihantar kepada kaedah sambungan hendaklah nilai dalam tatasusunan sambungan dalam fail konfigurasi config/database.php:

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

Anda juga boleh menggunakan kaedah getPdo pada contoh sambungan untuk mengakses asas Contoh 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视频教程

Atas ialah kandungan terperinci Pangkalan data apa yang disokong oleh laravel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah giliran laravelArtikel seterusnya:Apakah giliran laravel