База даних: Початок роботи
- Вступ
- Запуск необроблених запитів SQL
- Listening подій запитів
- Транзакції з базами даних
- Підключення до CLI бази даних
Вступ
Laravel робить взаємодію з базами даних надзвичайно простою через різні бази даних, використовуючи або необроблений SQL,вільний конструктор запитів, іEloquent ОРМ. В даний час Laravel підтримує чотири бази даних:
- MySQL 5.6+ (Version Policy)
- PostgreSQL 9.4+ (Version Policy)
- SQLite 3.8.8+
- SQL Server 2017+ (Version Policy)
Конфігурація
Конфігурація бази даних для вашої програми знаходиться за адресоюconfig/database.php
. У цьому файлі ви можете визначити всі свої підключення до бази даних, а також вказати, яке з’єднання слід використовувати за замовчуванням. У цьому файлі наведено приклади для більшості підтримуваних систем баз даних.
За замовчуванням зразок Laravelконфігурація середовищаготовий до використання з Homestead Laravel, яка є зручною віртуальною машиною для розробки Laravel на вашій локальній машині. Ви можете змінювати цю конфігурацію відповідно до вашої локальної бази даних.
Конфігурація SQLite
Після створення нової бази даних SQLite за допомогою команди, наприкладtouch database/database.sqlite
, Ви можете легко налаштувати змінні середовища, щоб вони вказували на нову базу даних, використовуючи абсолютний шлях до бази даних:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
Щоб увімкнути обмеження зовнішнього ключа для з'єднань SQLite, слід встановитиDB_FOREIGN_KEYS
середовище змінна доtrue
:
DB_FOREIGN_KEYS=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
варіант є_за бажанням_ value that can be used to allow the immediate reading of records that have been written to the database during the current request cycle. If the sticky
параметр увімкнено, і операція "запис" була виконана щодо бази даних протягом поточного циклу запиту, будь-які подальші операції "читання" використовуватимуть з'єднання "запис". Це гарантує, що будь-які дані, записані протягом циклу запиту, можуть бути негайно прочитані з бази даних під час того самого запиту. Ви самі вирішуєте, чи є це бажаною поведінкою для вашої програми.
Використання декількох підключень до бази даних
При використанні декількох з'єднань ви можете отримати доступ до кожного з'єднання черезconnection
метод наDB
фасад.name
перейшов доconnection
метод повинен відповідати одному із з'єднань, перелічених у вашомуconfig/database.php
файл конфігурації:
$users = DB::connection('foo')->select(...);
Ви також можете отримати доступ до необробленого базового екземпляра PDO за допомогоюgetPdo
метод на екземплярі підключення:
$pdo = DB::connection()->getPdo();
Запуск необроблених запитів SQL
Після налаштування підключення до бази даних ви можете запускати запити за допомогоюDB
фасад.DB
facade надає методи для кожного типу запиту:select
,update
,insert
,delete
, іstatement
.
Запуск вибраного запиту
Щоб запустити базовий запит, ви можете використовуватиselect
метод наDB
фасад:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
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, тоді як другий аргумент - це будь-які Binding параметрів, які потрібно прив’язати до запиту. Як правило, це значенняwhere
пункт обмеження. Прив'язка параметрів забезпечує захист від ін'єкції SQL.
select
метод завжди повертаєarray
результатів. Кожен результат у масиві буде PHPstdClass
об'єкт, що дозволяє отримати доступ до значень результатів:
foreach ($users as $user) {
echo $user->name;
}
Використання іменованих Bindings
Замість використання?
щоб представити прив'язку параметрів, ви можете виконати запит, використовуючи іменовані прив'язки:
$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 без прив'язки будь-яких значень. Ви можете використовуватиDB
фасадніunprepared
метод для досягнення цього:
DB::unprepared('update users set votes = 100 where name = "Dries"');
Оскільки непідготовлені оператори не пов’язують параметри, вони можуть бути вразливими до введення SQL. Ви ніколи не повинні дозволяти контрольовані користувачем значення в непідготовленому операторі.
Неявні коміти
При використанніDB
фасадніstatement
іunprepared
Методи в рамках транзакцій ви повинні бути обережними, щоб уникати Assertiors, які викликаютьнеявні коміти. Ці оператори змусять механізм бази даних опосередковано фіксувати всю транзакцію, залишаючи Laravel не в курсі рівня транзакцій бази даних. Прикладом такого твердження є створення таблиці бази даних:
DB::unprepared('create table a (col varchar(1) null)');
Будь ласка, зверніться до посібника MySQL дляперелік усіх Assertiorsщо запускають неявні коміти.
Listening подій запитів
Якщо ви хочете отримувати кожен SQL-запит, що виконується вашою програмою, ви можете використовуватиlisten
метод. Цей метод корисний для реєстрації запитів або Debug. Ви можете зареєструвати прослуховувач запитів упостачальник послуг:
<?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
Facadeдля запуску набору операцій в рамках транзакції бази даних. Якщо всередині транзакції виникає виняток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();
TheDB
Фасадні методи транзакцій контролюють транзакції для обохконструктор запитівіEloquent ОРМ.
Підключення до CLI бази даних
Якщо ви хочете підключитися до CLI вашої бази даних, ви можете використовуватиdb
Команда ремісників:
php artisan db
Якщо потрібно, ви можете вказати ім'я підключення до бази даних для підключення до підключення до бази даних, яке не є за замовчуванням:
php artisan db mysql