Unetway

Laravel - Database

Вступление

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

Как правило, соединение с базой данных настраиваются с помощью нескольких значений конфигурации , таких как hostdatabaseusernamepasswordи т.д. Каждый из этих значений конфигурации имеет свою собственную переменную , соответствующую среду. Это означает, что при настройке информации о соединении с вашей базой данных на рабочем сервере вам необходимо управлять несколькими переменными среды.

Некоторые поставщики управляемых баз данных, такие как 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'    => '',
],

Обратите внимание , что три ключа , которые были добавлены в массив конфигурации: readwriteи stickyreadИ writeключи имеют значение массива , содержащее один ключ: host. Остальные параметры базы данных для readи writeсоединений будут объединены с основной mysqlмассив.

Вам нужно всего лишь поместить элементы в readи writeмассивы , если вы хотите , чтобы переопределить значения из основного массива. Таким образом, в этом случае будет использоваться в качестве хоста для соединения «чтение», в то время как будет использоваться для соединения «запись». Учетные данные базы данных, префикс, набор символов и все другие параметры в основном массиве будут общими для обоих подключений.192.168.1.1192.168.1.3mysql

stickyВариант

Этот stickyпараметр является необязательным значением, которое можно использовать для немедленного чтения записей, которые были записаны в базу данных во время текущего цикла запроса. Если stickyопция включена и операция «запись» была выполнена с базой данных во время текущего цикла запроса, любые дальнейшие операции «чтения» будут использовать соединение «запись». Это гарантирует, что любые данные, записанные во время цикла запроса, могут быть немедленно прочитаны обратно из базы данных во время того же запроса. Вам решать, является ли это желаемым поведением для вашего приложения.

 

Использование нескольких подключений к базе данных

При использовании нескольких соединений вы можете получить доступ к каждому соединению с помощью connectionметода на DBфасаде. nameПередается connectionметоду должен соответствовать одному из соединений , перечисленных в вашем файле конфигурации:config/database.php

$users = DB::connection('foo')->select(...);

Вы также можете получить доступ к необработанному базовому экземпляру PDO, используя getPdoметод для экземпляра соединения:

$pdo = DB::connection()->getPdo();

 

Выполнение необработанных SQL-запросов

После того, как вы настроили соединение с базой данных, вы можете запускать запросы, используя DBфасад. DBФасад предоставляет методы для каждого типа запроса: selectupdateinsertdeleteи 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методах транзакционных фасадных контролируют сделки и для конструктора запросов и красноречивого ОРМА .