Вступление
Laravel делает взаимодействие с базами данных чрезвычайно простым в различных базах данных базы данных, используя либо сырой SQL, беглый конструктор запросов и Eloquent ORM . В настоящее время Laravel поддерживает четыре базы данных:
- MySQL
- PostgreSQL
- SQLite
- SQL Server
Конфигурация
Конфигурация базы данных для вашего приложения находится по адресу . В этом файле вы можете определить все ваши соединения с базой данных, а также указать, какое соединение должно использоваться по умолчанию. Примеры для большинства поддерживаемых систем баз данных приведены в этом файле.config/database.php
По умолчанию образец конфигурации среды Laravel готов к использованию с Laravel Homestead , которая является удобной виртуальной машиной для разработки Laravel на вашей локальной машине. Вы можете изменять эту конфигурацию по мере необходимости для вашей локальной базы данных.
Конфигурация SQLite
После создания новой базы данных SQLite с помощью такой команды, как , вы можете легко настроить переменные среды, чтобы они указывали на эту вновь созданную базу данных, используя абсолютный путь к базе данных:touch database/database.sqlite
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
Чтобы включить ограничения внешнего ключа для соединений SQLite, необходимо добавить foreign_key_constraints
параметр в файл конфигурации:config/database.php
'sqlite' => [
// ...
'foreign_key_constraints' => true,
],
Конфигурация с использованием URL
Как правило, соединение с базой данных настраиваются с помощью нескольких значений конфигурации , таких как host
, database
, username
, password
и т.д. Каждый из этих значений конфигурации имеет свою собственную переменную , соответствующую среду. Это означает, что при настройке информации о соединении с вашей базой данных на рабочем сервере вам необходимо управлять несколькими переменными среды.
Некоторые поставщики управляемых баз данных, такие как Heroku, предоставляют единый «URL» базы данных, который содержит всю информацию о соединении для базы данных в одной строке. Пример URL базы данных может выглядеть примерно так:
mysql://root:password@127.0.0.1/forge?charset=UTF-8
Эти URL обычно следуют стандартному соглашению схемы:
driver://username:password@host:port/database?options
Для удобства Laravel поддерживает эти URL-адреса в качестве альтернативы настройке базы данных с несколькими вариантами конфигурации. Если присутствует параметр конфигурации url
(или соответствующая DATABASE_URL
переменная среды), он будет использоваться для извлечения соединения с базой данных и информации о полномочиях.
Чтение и запись подключений
Иногда вы можете использовать одно соединение с базой данных для операторов SELECT, а другое - для операторов 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' => '',
],
Обратите внимание , что три ключа , которые были добавлены в массив конфигурации: read
, write
и sticky
. read
И write
ключи имеют значение массива , содержащее один ключ: host
. Остальные параметры базы данных для read
и write
соединений будут объединены с основной mysql
массив.
Вам нужно всего лишь поместить элементы в read
и write
массивы , если вы хотите , чтобы переопределить значения из основного массива. Таким образом, в этом случае будет использоваться в качестве хоста для соединения «чтение», в то время как будет использоваться для соединения «запись». Учетные данные базы данных, префикс, набор символов и все другие параметры в основном массиве будут общими для обоих подключений.192.168.1.1
192.168.1.3
mysql
sticky
Вариант
Этот sticky
параметр является необязательным значением, которое можно использовать для немедленного чтения записей, которые были записаны в базу данных во время текущего цикла запроса. Если sticky
опция включена и операция «запись» была выполнена с базой данных во время текущего цикла запроса, любые дальнейшие операции «чтения» будут использовать соединение «запись». Это гарантирует, что любые данные, записанные во время цикла запроса, могут быть немедленно прочитаны обратно из базы данных во время того же запроса. Вам решать, является ли это желаемым поведением для вашего приложения.
Использование нескольких подключений к базе данных
При использовании нескольких соединений вы можете получить доступ к каждому соединению с помощью connection
метода на DB
фасаде. name
Передается connection
методу должен соответствовать одному из соединений , перечисленных в вашем файле конфигурации:config/database.php
$users = DB::connection('foo')->select(...);
Вы также можете получить доступ к необработанному базовому экземпляру PDO, используя getPdo
метод для экземпляра соединения:
$pdo = DB::connection()->getPdo();
Выполнение необработанных SQL-запросов
После того, как вы настроили соединение с базой данных, вы можете запускать запросы, используя DB
фасад. DB
Фасад предоставляет методы для каждого типа запроса: select
, update
, insert
, delete
и statement
.
Выполнение выбранного запроса
Чтобы выполнить базовый запрос, вы можете использовать select
метод на DB
фасаде:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
Первым аргументом, передаваемым select
методу, является необработанный запрос SQL, а вторым аргументом являются любые привязки параметров, которые должны быть связаны с запросом. Как правило, это значения where
ограничений предложения. Привязка параметров обеспечивает защиту от внедрения SQL.
select
Метод всегда будет возвращать array
результаты. Каждый результат в массиве будет stdClass
объектом PHP , позволяющим вам получить доступ к значениям результатов:
foreach ($users as $user) {
echo $user->name;
}
Использование именованных привязок
Вместо использования ?
для представления привязок параметров, вы можете выполнить запрос, используя именованные привязки:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Запуск оператора вставки
Чтобы выполнить insert
оператор, вы можете использовать insert
метод на DB
фасаде. Например select
, этот метод принимает необработанный SQL-запрос в качестве первого аргумента и привязки в качестве второго аргумента:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Запуск оператора обновления
Этот update
метод следует использовать для обновления существующих записей в базе данных. Количество строк, затронутых оператором, будет возвращено:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Запуск оператора удаления
delete
Метод должен быть использован для удаления записей из базы данных. Мол update
, будет возвращено количество затронутых строк:
$deleted = DB::delete('delete from users');
Запуск общего заявления
Некоторые операторы базы данных не возвращают никакого значения. Для этих типов операций вы можете использовать statement
метод на DB
фасаде:
DB::statement('drop table users');
Прослушивание событий запроса
Если вы хотите получать каждый SQL-запрос, выполняемый вашим приложением, вы можете использовать этот listen
метод. Этот метод полезен для регистрации запросов или отладки. Вы можете зарегистрировать прослушиватель запросов у поставщика услуг :
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
}
Операции с базой данных
Вы можете использовать transaction
метод на DB
фасаде для запуска набора операций внутри транзакции базы данных. Если Closure
в транзакции возникнет исключение , транзакция будет автоматически откатана. Если Closure
выполняется успешно, транзакция будет автоматически зафиксирована. Вам не нужно беспокоиться о ручном откате или фиксации при использовании transaction
метода:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
Обработка тупиков
transaction
Метод принимает необязательный второй аргумент , который определяет, сколько раз транзакция должна быть повторная попытка при возникновении взаимоблокировки. Как только эти попытки будут исчерпаны, будет сгенерировано исключение:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
Использование транзакций вручную
Если вы хотите начать транзакцию вручную и иметь полный контроль над откатами и фиксациями, вы можете использовать beginTransaction
метод на DB
фасаде:
DB::beginTransaction();
Вы можете откатить транзакцию с помощью rollBack
метода:
DB::rollBack();
Наконец, вы можете совершить транзакцию с помощью commit
метода:
DB::commit();
В
DB
методах транзакционных фасадных контролируют сделки и для конструктора запросов и красноречивого ОРМА .
0 комментариев