Версія фреймворка: 8.x

База даних: Початок роботи

Вступ

Laravel робить взаємодію з базами даних надзвичайно простою через різні бази даних, використовуючи або необроблений SQL,вільний конструктор запитів, іEloquent ОРМ. В даний час Laravel підтримує чотири бази даних:

Конфігурація

Конфігурація бази даних для вашої програми знаходиться за адресою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фасад.DBfacade надає методи для кожного типу запиту: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метод наDBFacadeдля запуску набору операцій в рамках транзакції бази даних. Якщо всередині транзакції виникає виняток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