Permulaan cepat


Mengkonfigurasi

🎜🎜

Pengenalan

Laravel boleh menggunakan SQL asli, pembina pertanyaan yang fasih dan Eloquent ORM untuk berinteraksi dengan pangkalan data dengan sangat mudah dalam pelbagai bahagian belakang pangkalan data. Laravel kini menyokong empat pangkalan data:

  • MySQL
  • PostgreSQL
  • SQLite
  • SQL Server

Konfigurasi.

config/database.php 文件中,你可以在此定义所有的数据库连接,并指定默认使用的连接。此文件内提供了大部分 Laravel 能支持的数据库配置示例。

默认情况下,Laravel  的示例 环境配置 使用了 Laravel Homestead(这是一种小型虚拟机,能让你很方便地在本地进行 Laravel 的开发)。你可以根据本地数据库的需要修改这个配置。

SQLite 配置

使用类似 touch database/database.sqlite 之类命令创建一个新的 SQLite 数据库之后,可以使用数据库的绝对路径配置环境变量来指向这个新创建的数据库:

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

如果要开启 SQLite 连接的外键约束,您应该将 foreign_key_constraints 添加到  config / database.php 配置文件中:

'sqlite' => [   
 // ...    
 'foreign_key_constraints' => true,
 ],

读写分离

有时候你希望 SELECT 语句使用一个数据库连接,而 INSERT,UPDATE,和 DELETE 语句使用另一个数据库连接。在 Laravel 中,无论你是使用原生查询,查询构造器,或者是 Eloquent ORM,都能轻松的实现

为了弄明白读写分离是如何配置的,我们先来看个例子:

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

注意在以上的例子中,配置数组中增加了三个键,分别是 readwritestickyreadwrite 的键都包含一个键为 host 的数组。而 readwrite 的其他数据库都在键为 mysql 的数组中。

如果你想重写主数组中的配置,只需要修改 readwrite 数组即可。所以,这个例子中:  192.168.1.1 将作为 「读」 连接主机,而 192.168.1.2 将作为 「写」 连接主机。这两个连接会共享 mysql fail diletakkan dalam config/database.php < /code>, di mana anda boleh menentukan semua sambungan pangkalan data dan menentukan sambungan untuk digunakan secara lalai. Fail ini menyediakan contoh kebanyakan konfigurasi pangkalan data yang disokong oleh Laravel.

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

Konfigurasi SQLite

🎜Gunakan arahan seperti sentuh pangkalan data/database.sqlite untuk mencipta SQLite After yang baharu pangkalan data, anda boleh mengkonfigurasi pembolehubah persekitaran untuk menunjuk ke pangkalan data yang baru dibuat menggunakan laluan mutlak pangkalan data: 🎜
$users = DB::connection('foo')->select(...);
🎜 Jika anda ingin mendayakan kekangan kunci asing untuk sambungan SQLite, anda harus menambah foreign_key_constraints kepada config / database.php Dalam fail konfigurasi: 🎜
$pdo = DB::connection()->getPdo();
🎜🎜🎜
🎜🎜pemisahan baca-tulis🎜🎜Kadangkala anda mahu pernyataan SELECT menggunakan satu sambungan pangkalan data, dan pernyataan INSERT, UPDATE dan DELETE untuk menggunakan sambungan pangkalan data yang lain. Dalam Laravel, sama ada anda menggunakan pertanyaan asli, pembina pertanyaan atau ORM Eloquent, anda boleh melaksanakannya dengan mudah🎜🎜Untuk memahami cara pemisahan baca-tulis dikonfigurasikan, mari kita lihat contoh dahulu:🎜
<?php
    namespace App\Http\Controllers;
    use Illuminate\Support\Facades\DB;
    use App\Http\Controllers\Controller;
    class UserController extends Controller{  
     /**
     * 显示应用程序中所有用户的列表
     *
     * @return Response
     */  
     public function index()   
      {       
         $users = DB::select('select * from users where active = ?', [1]);        
         return view('user.index', ['users' => $users]);    
        }
    }
🎜Perhatikan bahawa Dalam perkara di atas contoh, tiga kekunci ditambahkan pada tatasusunan konfigurasi, iaitu baca, tulis dan sticky. Kekunci untuk kedua-dua baca dan write mengandungi tatasusunan dengan kunci host. Pangkalan data lain untuk read dan write berada 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 akan bersambung kepada hos sebagai "baca", dan 192.168.1.2 akan menyambung kepada hos sebagai "tulis". Kedua-dua sambungan ini akan berkongsi pelbagai konfigurasi tatasusunan mysql, seperti bukti kelayakan pangkalan data (nama pengguna/kata laluan), awalan, pengekodan aksara, dsb. 🎜🎜🎜

sticky option

sticky ialah nilai pilihan yang boleh digunakan untuk membaca segera Rekod yang ditulis ke pangkalan data. Jika pilihan sticky 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 tuan-hamba. Sama ada untuk mendayakannya, bagaimanapun, bergantung pada keperluan aplikasi. sticky 选项

sticky 是一个 可选值,它可用于立即读取在当前请求周期内已写入数据库的记录。若 sticky 选项被启用,并且当前请求周期内执行过 「写」 操作,那么任何 「读」 操作都将使用 「写」 连接。这样可确保同一个请求周期内写入的数据可以被立即读取到,从而避免主从延迟导致数据不一致的问题。不过是否启用它,取决于应用程序的需求。

使用多个数据库连接

当使用多个数据库连接时,你可以通过 DB Facade 的 connection 方法访问每一个连接。传递给 connection 方法的参数 name 应该是 config/database.php 配置文件中 connections 数组中的一个值:

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

你也可以使用一个连接实例上的 getPdo 方法访问底层的 PDO 实例:

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

运行原生 SQL 查询

一旦配置好数据库连接后,便可以使用 DB facade 运行查询。 DB facade 为每种类型的查询提供了方法: selectupdateinsertdeletestatement

运行 Select 查询

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

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

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

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

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

使用命名绑定

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

$deleted = DB::delete('delete from users');

运行插入语句

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

DB::statement('drop table users');

运行更新语句

update

Menggunakan berbilang sambungan pangkalan data

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

<?php
    namespace App\Providers;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\ServiceProvider;
    class AppServiceProvider extends ServiceProvider{  
      /**
     * 启动应用服务
     *
     * @return void
     */    
    public function boot()  
      {     
         DB::listen(function ($query) {          
           // $query->sql            
           // $query->bindings            
           // $query->time       
          });   
        }  
    /**
     * 注册服务提供器
     *
     * @return void
     */   
    public function register()  
      {      
        //   
       }
  }
< p> Anda juga boleh mengakses tika PDO asas menggunakan kaedah getPdo pada tika sambungan: 🎜
DB::transaction(function () {  
  DB::table('users')->update(['votes' => 1]);    
  DB::table('posts')->delete();
 });

🎜

🎜

Jalankan pertanyaan SQL asli

Setelah sambungan pangkalan data dikonfigurasikan, anda boleh menggunakan fasad DB untuk menjalankan pertanyaan. Fasad DB menyediakan kaedah untuk setiap jenis pertanyaan: pilih, kemas kini, insert, delete < /code> dan statement. 🎜

🎜🎜Jalankan pertanyaan Pilih

Anda boleh menggunakan kaedah select DB Fasad Untuk menjalankan pernyataan pertanyaan asas: 🎜

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

Parameter pertama yang dihantar ke kaedah select ialah pertanyaan SQL asli dan parameter kedua ialah parameter yang perlu diikat pada pertanyaan. nilai. Biasanya, nilai ini digunakan untuk mengekang pernyataan where. Pengikatan parameter digunakan untuk menghalang suntikan SQL. 🎜

select kaedah akan sentiasa mengembalikan tatasusunan, setiap hasil dalam tatasusunan ialah objek = StdClass, nilai hasil boleh diakses seperti ini: 🎜

DB::beginTransaction();
< div name="5be97e" data-unique="5be97e">🎜🎜Gunakan name binding

Selain menggunakan ? untuk menunjukkan parameter binding, anda juga boleh menggunakan name binding Untuk melaksanakan pertanyaan: 🎜

DB::rollBack();
🎜🎜Jalankan pernyataan sisipan

Anda boleh menggunakan sisipan DB Kaedah Fasad untuk melaksanakan pernyataan insert. Seperti select, kaedah ini mengambil pertanyaan SQL asli sebagai parameter pertamanya dan data terikat sebagai parameter kedua: 🎜

DB::commit();
🎜🎜Jalankan kaedah kemas kini kenyataan

kemas kini digunakan untuk mengemas kini rekod sedia ada dalam pangkalan data. Kaedah ini mengembalikan bilangan baris yang terjejas oleh pernyataan ini: 🎜rrreee🎜🎜

Run delete statement

Kaedahdelete digunakan untuk memadam rekod daripada pangkalan data. Seperti kemas kini, mengembalikan bilangan baris yang dipengaruhi oleh pernyataan: delete 方法用于从数据库中删除记录。与 update 一样,返回受该语句影响的行数:

rrreee

运行普通语句

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

rrreee

监听查询事件

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

rrreee

数据库事务

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

rrreee

处理死锁

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

rrreee

手动使用事务

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

rrreee

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

rrreee

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

rrreee

{tip} DBrrreee

Jalankan pernyataan biasa
🎜
🎜

Mendengar peristiwa pertanyaan

🎜Jika anda ingin memantau setiap pertanyaan SQL yang dilaksanakan oleh atur cara, anda boleh menggunakan dengar< /kod> kaedah. Kaedah ini berguna untuk log pertanyaan atau penyahpepijatan. Anda boleh mendaftarkan pendengar pertanyaan anda dalam pembekal perkhidmatan: 🎜rrreee🎜
🎜🎜
🎜

Transaksi Pangkalan Data

🎜Anda boleh menggunakan kaedah urus niaga
fasad DB untuk menjalankan satu set operasi dalam transaksi pangkalan data. Jika pengecualian berlaku dalam penutupan urus niaga Penutupan, urus niaga akan ditarik balik. Jika penutupan urus niaga Penutupan berjaya dilaksanakan, transaksi akan dilakukan secara automatik. Sebaik sahaja anda menggunakan transaksi, anda tidak perlu lagi bimbang tentang rollback manual atau komitmen: 🎜rrreee
🎜🎜Mengendalikan kebuntuan🎜🎜 transaksi menerima parameter kedua pilihan, yang digunakan untuk menunjukkan bilangan kali transaksi akan diulang apabila kebuntuan berlaku. Setelah bilangan percubaan yang ditentukan telah selesai, pengecualian akan dilemparkan: 🎜rrreee
🎜🎜Gunakan transaksi secara manual🎜🎜Jika anda ingin memulakan transaksi secara manual dan kembali Jika anda mempunyai kawalan penuh ke atas roll and commit, anda boleh menggunakan DB kaedah beginTransaction Facade: 🎜rrreee🎜Anda boleh menggunakan kaedah rollBack untuk melancarkan transaksi: 🎜rrreee🎜Akhir sekali, anda boleh melakukan transaksi menggunakan kaedah commit: 🎜rrreee
🎜{tip} Kaedah transaksi DB fasad juga digunakan untuk pembina pertanyaan dan ORM Fasih .🎜🎜🎜Artikel ini mula-mula diterbitkan di tapak web 🎜LearnKu.com🎜. 🎜🎜