Démarrage rapide
Introduction
Laravel peut utiliser SQL natif, un générateur de requêtes fluide et Eloquent ORM pour interagir très simplement avec la base de données dans divers backends de base de données. Laravel prend actuellement en charge quatre bases de données :
- MySQL
- PostgreSQL
- SQLite
- SQL Server
Le fichier de configuration de la base de données est placé dans
config/base de données.php < /code>, dans lequel vous pouvez définir toutes les connexions à la base de données et spécifier la connexion à utiliser par défaut. Ce fichier fournit des exemples de la plupart des configurations de bases de données prises en charge par Laravel.
Par défaut, l'exemple de configuration d'environnement de Laravel utilise Laravel Homestead (il s'agit d'une petite machine virtuelle qui vous permet de développer facilement Laravel localement). Vous pouvez modifier cette configuration en fonction des besoins de votre base de données locale.
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' => '', ],
注意在以上的例子中,配置数组中增加了三个键,分别是
read
,write
和sticky
。read
和write
的键都包含一个键为host
的数组。而read
和write
的其他数据库都在键为mysql
的数组中。如果你想重写主数组中的配置,只需要修改
read
和write
数组即可。所以,这个例子中:192.168.1.1
将作为 「读」 连接主机,而192.168.1.2
将作为 「写」 连接主机。这两个连接会共享mysql
Configuration SQLite
Utilisez une commande commetouch database/database.sqlite
pour créer un nouveau SQLite Après la base de données, vous pouvez configurer la variable d'environnement pour qu'elle pointe vers la base de données nouvellement créée en utilisant le chemin absolu de la base de données :$users = DB::connection('foo')->select(...);
🎜 Si vous souhaitez activer les contraintes de clé étrangère pour les connexions SQLite, vous devez ajouterforeign_key_constraints
àconfig/database.php
Dans le fichier de configuration : 🎜$pdo = DB::connection()->getPdo();
🎜🎜🎜🎜🎜Séparation lecture-écriture🎜🎜Parfois, vous souhaitez que l'instruction SELECT utilise une connexion à la base de données et que les instructions INSERT, UPDATE et DELETE utilisent une autre connexion à la base de données. Dans Laravel, que vous utilisiez des requêtes natives, des générateurs de requêtes ou Eloquent ORM, vous pouvez facilement l'implémenter🎜🎜Afin de comprendre comment la séparation lecture-écriture est configurée, regardons d'abord un exemple :🎜<?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]); } }
🎜Notez que dans ce qui précède Par exemple, trois clés sont ajoutées au tableau de configuration, à savoirread
,write
etsticky
. Les clés pourread
etwrite
contiennent un tableau avec la cléhost
. Les autres bases de données pourread
etwrite
sont dans le tableau avec la clémysql
. 🎜🎜Si vous souhaitez remplacer la configuration dans le tableau principal, modifiez simplement les tableauxread
etwrite
. Ainsi, dans cet exemple :192.168.1.1
se connectera à l'hôte en tant que "lecture", et192.168.1.2
se connectera à l'hôte en tant que "écriture". Ces deux connexions partageront diverses configurations du tableaumysql
, telles que les informations d'identification de la base de données (nom d'utilisateur/mot de passe), le préfixe, l'encodage des caractères, etc. 🎜🎜🎜L'option
sticky
sticky
est une valeur facultative qui peut être utilisée pour lire immédiatement les enregistrements écrits dans la base de données. Si l'optionsticky
est activée et qu'une opération « d'écriture » est effectuée pendant le cycle de requête en cours, toutes les opérations de « lecture » utiliseront la connexion « d'écriture ». Cela garantit que les données écrites dans le même cycle de requête peuvent être lues immédiatement, évitant ainsi le problème d'incohérence des données provoqué par le retard maître-esclave. Toutefois, son activation dépend des besoins de l'application.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 为每种类型的查询提供了方法:select
,update
,insert
,delete
和statement
。运行 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
Utilisation de plusieurs connexions à des bases de données
Lorsque vous utilisez plusieurs connexions à la base de données, vous pouvez accéder à chaque connexion via la méthode
connection
deDB
Facade. Le paramètrename
passé à la méthodeconnection
doit être une valeur dans le tableau connections du fichier de configurationconfig/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> Vous pouvez également accéder à l'instance PDO sous-jacente à l'aide de la méthodegetPdo
sur une instance de connexion : 🎜DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
🎜Exécuter des requêtes SQL natives
Une fois la connexion à la base de données configurée, vous pouvez utiliser la façade
DB
pour exécuter des requêtes. La façadeDB
fournit des méthodes pour chaque type de requête :select
,update
,insert
,delete < /code> et
instruction
. 🎜🎜🎜Exécuter une requête SelectVous pouvez utiliser la méthode
select
deDB
Façade Pour exécuter une instruction de requête de base : 🎜DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }, 5);
Le premier paramètre passé à la méthode
select
est une requête SQL native, et le deuxième paramètre est le paramètre qui doit être lié à la requête. valeur. Généralement, ces valeurs sont utilisées pour contraindre les instructionswhere
. La liaison de paramètres est utilisée pour empêcher l’injection SQL. La méthode 🎜select
renverra toujours un tableau, chaque résultat dans le tableau est un objet =StdClass
, la valeur du résultat est accessible comme ceci : 🎜DB::beginTransaction();
< div name="5be97e" data-unique="5be97e">🎜🎜Utiliser la liaison nomméeEn plus d'utiliser
?
pour indiquer la liaison de paramètre, vous pouvez également utiliser la liaison nommée Pour exécuter une requête : 🎜DB::rollBack();
🎜🎜Exécutez l'instruction insertVous pouvez utiliser l'
insert de la
pour exécuter l'instructionDB
Méthode Facadeinsert
. Commeselect
, cette méthode prend la requête SQL native comme premier paramètre et les données liées comme deuxième paramètre : 🎜DB::commit();
🎜🎜Run La méthode d'instruction de mise à jourupdate
est utilisée pour mettre à jour les enregistrements existants dans la base de données. Cette méthode renvoie le nombre de lignes affectées par cette instruction : 🎜rrreee🎜🎜Exécuter l'instruction delete
La méthode
rrreeedelete
est utilisée pour supprimer des enregistrements de la base de données. Commeupdate
, renvoie le nombre de lignes affectées par l'instruction :delete
方法用于从数据库中删除记录。与update
一样,返回受该语句影响的行数:运行普通语句
有些数据库语句不会有任何返回值。对于这些语句,你可以使用
rrreeeDB
Facade 的statement
方法来运行:监听查询事件
如果你想监控程序执行的每一个 SQL 查询,你可以使用
rrreeelisten
方法。这个方法对于记录查询或调试非常有用。你可以在 服务提供器 中注册你的查询监听器:数据库事务
你可以使用
rrreeeDB
facade 的transaction
方法在数据库事务中运行一组操作。如果事务的闭包Closure
中出现一个异常,事务将会回滚。如果事务闭包Closure
执行成功,事务将自动提交。一旦你使用了transaction
, 就不再需要担心手动回滚或提交的问题:处理死锁
rrreeetransaction
方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常:手动使用事务
如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用
rrreeeDB
Facade 的beginTransaction
方法:你可以使用
rrreeerollBack
方法回滚事务:最后,你可以使用
rrreeecommit
方法提交事务:{tip}
🎜DB
rrreee🎜Écoute des événements de requête
🎜Si vous souhaitez surveiller chaque requête SQL exécutée par le programme, vous pouvez utiliser lelisten< /code> méthode. Cette méthode est utile pour la journalisation des requêtes ou le débogage. Vous pouvez enregistrer votre écouteur de requêtes auprès du fournisseur de services : 🎜rrreee🎜🎜🎜
🎜Transactions de base de données
🎜Vous pouvez utiliser la méthodetransaction
de la façadeDB
pour exécuter un ensemble d'opérations dans une transaction de base de données. Si une exception se produit lors de la fermetureClosure
de la transaction, la transaction sera annulée. Si la fermeture de la transactionClosure
s'exécute avec succès, la transaction sera automatiquement validée. Une fois que vous utiliseztransaction
, vous n'avez plus à vous soucier de la restauration ou de la validation manuelle : 🎜rrreee🎜🎜Gestion des blocages🎜🎜 Letransaction
accepte un deuxième paramètre facultatif, qui est utilisé pour indiquer le nombre de fois que la transaction sera répétée en cas de blocage. Une fois le nombre défini de tentatives effectué, une exception sera levée : 🎜rrreee🎜🎜Utilisez les transactions manuellement🎜🎜Si vous souhaitez démarrer une transaction manuellement et revenir it Si vous avez un contrôle total sur roll et commit, vous pouvez utiliser la méthodebeginTransaction
deDB
Facade : 🎜rrreee🎜Vous pouvez utiliser la méthoderollBack
pour annuler la transaction : 🎜rrreee🎜Enfin, vous pouvez valider la transaction en utilisant la méthodecommit
: 🎜rrreee🎜{tip} La méthode de transaction de la
DB
façade s'applique également au générateur de requêtes et à Eloquent ORM .🎜🎜🎜Cet article a été publié pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜