Основы работы с базами данных
Этот перевод актуален для англоязычной документации на 28.01.2017 (ветка 5.3) , 08.12.2016 (ветка 5.2) , 19.06.2016 (ветка 5.1) и 08.02.2016 (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.
Введение
В Laravel можно чрезвычайно просто взаимодействовать с БД на различных «движках» , будь то сырой SQL, гибкий построитель запросов или Eloquent ORM . На данный момент Laravel поддерживает четыре системы баз данных:
Настройка
Настройки работы с БД хранятся в файле config/database.php . Здесь вы можете указать все используемые вами соединения к БД, а также задать соединение по умолчанию. Примеры настройки большинства поддерживаемых видов подключений находятся в этом же файле.
По умолчанию образец настройки окружения Laravel подготовлен для использования с Laravel Homestead — удобной виртуальной машиной для Laravel-разработки на вашей локальной машине. Разумеется, вы можете изменить эти настройки для работы с вашей локальной БД.
Настройка SQLite
После создания новой базы данных SQLite при помощи команды sh touch database/database.sqlite , вы можете легко настроить переменные вашей среды для этой новой базы данных, используя её абсолютный путь:
confDB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite
Настройка SQL Server
Laravel поддерживает работу с SQL Server из коробки, надо лишь добавить настройку подключения к БД в ваш файл настроек config/database.php :
conf'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', ],
Соединения для чтения и записи
Иногда вам может понадобиться использовать разные подключения к базе данных: одно для запросов SELECT , а другое для запросов INSERT , UPDATE и DELETE . В Laravel это делается очень просто, и всегда будет использоваться соответствующее соединение, используете ли вы сырые запросы, построитель запросов или Eloquent ORM .
Чтобы увидеть, как должны быть настроены соединения чтения/записи, давайте посмотрим на этот пример:
'mysql' => [ 'read' => [ 'host' => '192.168.1.1',
], 'write' => [ 'host' => '196.168.1.2' ], 'driver' => 'mysql', 'database' => 'database', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '',
],
Обратите внимание, что в массив настроек были добавлены два элемента: sql ‘read’ и sql ‘write’ . Оба элемента представляют собой массив с одним элементом sql ‘host’ . Остальные параметры БД для подключений чтения/записи будут заимствованы из основного массива sql ‘mysql’ .
Вам стоит размещать элементы в массивах PHP read и PHP write , только если вы хотите переопределить их значения из основного массива. Таким образом, в этом случае, 192.168.1.1 будет использоваться как хост для подключения «чтения» , а 192.168.1.2 — для подключения «записи» . Учётные данные для БД, префикс, набор символов, и все другие параметры основного массива sql ‘mysql’ будут использованы для обоих подключений.
Использование нескольких соединений с БД
При использовании нескольких соединений с БД вы можете получить доступ к каждому из них через метод PHP connection () фасада DB . Передаваемое в этот метод имя name должно соответствовать одному из перечисленных в файле config/database.php соединений:
$users = DB::connection('foo')->select(. );
Вы также можете получить низкоуровневый объект PDO для этого подключения методом PHP getPdo () :
$pdo = DB::connection()->getPdo();
Выполнение сырых SQL-запросов
Когда вы настроили соединение с базой данных, вы можете выполнять запросы, используя фасад DB . Этот фасад имеет методы для каждого типа запроса: select , update , insert , delete и statement .
Выполнение запроса SELECT
Чтобы выполнить базовый запрос, можно использовать метод PHP select () фасада DB :
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB; //для версии 5.2 и ранее:
//use 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]);
>
>
Первый аргумент метода PHP select () — сырой SQL-запрос, второй — любые связки параметров для прикрепления к запросу. Обычно это значения ограничений условия where . Привязка параметров обеспечивает защиту от SQL-инъекций.
Метод PHP select () всегда возвращает массив результатов. Каждый результат в массиве — объект PHP StdClass , что позволяет вам обращаться к значениям результатов:
foreach ($users as $user) echo $user->name;
>
Использование привязки имён
Вместо использования знака вопроса ? для обозначения привязки параметров, вы можете выполнить запрос, используя привязку по имени:
$results = DB::select('select * from users where style="color: #007700">, ['id' => 1]);
Выполнение запроса INSERT
Чтобы выполнить запрос insert , можно использовать метод PHP insert () фасада DB . Как и PHP select () , данный метод принимает сырой SQL-запрос первым аргументом, а вторым — привязки:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Выполнение запроса UPDATE
Для обновления существующих записей в БД используется метод PHP update () , который возвращает количество изменённых записей:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Выполнение запроса DELETE
Для удаления записей из БД используется метод PHP delete () , который возвращает количество изменённых записей:
$deleted = DB::delete('delete from users');
Выполнение запроса общего типа
Некоторые запросы к БД не возвращают никаких значений. Для операций такого типа можно использовать метод PHP statement () фасада DB :
DB::statement('drop table users');
Прослушивание событий запросов
Если вы хотите получать каждый выполненный вашим приложением SQL-запрос, используйте метод PHP listen () . Этот метод полезен для журналирования запросов и отладки. Вы можете зарегистрировать свой слушатель запросов в сервис-провайдере:
namespace App\Providers;
use Illuminate\Support\Facades\DB; //для версии 5.2 и ранее:
//use DB; use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider /**
* Загрузка всех сервисов приложения.
*
* @return void
*/ public function boot()
DB::listen(function ($query) // $query->sql
// $query->bindings
// $query->time
//В этом примере из документации по версии 5.1 и ранее было:
//DB::listen(function($sql, $bindings, $time) // //
>);
>
/**
* Регистрация сервис-провайдера.
*
* @return void
*/ public function register()
// >
>
Транзакции
Для выполнения набора запросов внутри одной транзакции вы можете использовать метод PHP transaction () фасада DB . Если в замыкании транзакции произойдёт исключение, она автоматически откатится. А если замыкание выполнится успешно, транзакция автоматически применится к БД. Вам не стоит переживать об этом при использовании метода PHP transaction () :
DB::transaction(function () DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
>);
Обработка взаимных блокировок
Метод PHP transaction () принимает второй необязательный аргумент, с помощью которого задаётся число повторных попыток транзакции при возникновении взаимной блокировки (англ. deadlock). После истечения этих попыток будет выброшено исключение:
DB::transaction(function () DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
>, 5);
Ручное использование транзакций
Если вы хотите запустить транзакцию вручную и иметь полный контроль над её откатом и применением, используйте метод PHP beginTransaction () фасада DB :
DB::beginTransaction();
Вы можете откатить транзакцию методом PHP rollback () :
DB::rollback();
Наконец, вы можете применить транзакцию методом PHP commit () :
DB::commit();
Методы фасада DB для транзакций также контролируют транзакции построителя запросов и Eloquent ORM .
Транзакция — особое состояние БД, в котором выполняемые запросы либо все вместе успешно завершаются, либо (в случае ошибки) все их изменения откатываются. Это позволяет поддерживать целостность внутренней структуры данных. К примеру, если вы вставляете запись о заказе, а затем в отдельную таблицу добавляете товары, то при неуспешном выполнении скрипта (в том числе падения веб-сервера, ошибки в запросе и пр. ) СУБД автоматически удалит запись о заказе и все товары, которые вы успели добавить — прим. пер.
Иногда вам может понадобиться переподключиться и вы можете сделать это так:
DB::reconnect('foo');
Если вам нужно отключиться от данной БД из-за превышения основного предела экземпляров PDO max_connections, используйте метод PHP disconnect () :
DB::disconnect('foo');
Журнал запросов
По умолчанию Laravel записывает все SQL-запросы, выполненные в рамках текущего запроса страницы. Однако в некоторых случаях — например, при вставке большого набора записей — это может быть слишком ресурсозатратно. Для подключения журнала вы можете использовать метод PHP enableQueryLog () :
DB::connection()->enableQueryLog();
Чтобы получить массив выполненных запросов, вы можете использовать метод PHP getQueryLog () :
$queries = DB::getQueryLog();
Комментарии (2)
Файла app/config/database.php не существует, но есть config/database.php
Жаль что так никто и не ответил за 5 лет человеку.
Аббревиатура app стандартно означает весь путь до папки приложения, поэтому вместо app принято подставлять например /var/www/html и в этом случае указание файла конфигурации вполне себе уместно. Единственно что для обозначения что это аббревиатура чаще всего пишут @app
- Выпуски 4.x/5.x
- Обновление до новой версии
- Помощь проекту
Руководства:
Основы архитектуры:
- Поставщики услуг
- Сервис-контейнеры
- Контракты
- Фасады
- Прохождение запроса
- Структура приложения
- Аутентификация
- Авторизация (5.1+)
- Оплата (биллинг)
- Кэш
- Коллекции
- Командная шина
- Расширение фреймворка
- Elixir
- Шифрование
- Envoy
- Scout
- Ошибки и журнал
- События
- Файловая система и облака
- API Authentication (Passport)
- Хэширование
- Функции
- Локализация
- Работа с e-mail
- Разработка пакетов
- Страничный вывод
- Очереди
- Сессии
- Шаблоны Blade (5.1+)
- Шаблоны (5.0)
- Планировщик
- Юнит-тесты
- Проверка ввода
- JavaScript и CSS
- Сброс пароля
Базы данных:
Eloquent ORM
- Основы командного интерфейса
- Создание команд
Статистика: Символов — 10 246/8 689 без пробелов (6 053/5 203 без кода):, слов — 851
Наверх Опечатка? Выдели и нажми Ctrl+Enter (Orphus.ru)
Подключение к базе данных в Laravel
В Laravel настройки доступа к базе данных хранятся в файле config/database.php . В этом файле можно найти уже существующие примеры подключений к большинству поддерживаемых баз: MySQL, Postgres, SQLite, SQL Server. Сам тип сервера указывается в строке:
'default' => env('DB_CONNECTION', 'mysql'),
Чтобы настроить соединение с этой базой данных найдите соответствующий массив в файле конфигураций и измените параметры доступа (порт и хост, он же ip адрес сервера):
[ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), // ip адрес сервера БД 'port' => env('DB_PORT', '3306'), // порт, для MySQL по умолчанию 3306 'database' => env('DB_DATABASE', 'имя_базы'), 'username' => env('DB_USERNAME', 'имя_пользователя'), 'password' => env('DB_PASSWORD', 'пароль'), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], ?>
Для некоторых видов установок в Laravel используется файл «.env.php», в котором хранятся данные для соединения с базой. Поэтому обязательно поменяйте в нём данные на актуальные. Иначе во время подключения можнт появиться ошибка «Access denied for user ‘homestead’@’localhost’«. Чтобы исправить проблему, можно попробовать перезапустить сервис веб сервера и выполнить команду для очистки кеша php artisan config:clear
Настройка доступа к БД в Laravel
Настройки работы с БД хранятся в файле config/database.php . Здесь вы можете указать все используемые вами соединения к БД, а также задать соединение по умолчанию. Примеры настройки большинства поддерживаемых видов подключений находятся в этом же файле.
Laravel поддерживает различные движки базы данных: MySQL, Postgres, SQLite, SQL Server. Движок по умолчанию указан в следующей настройке:
env(‘DB_CONNECTION’, ‘mysql’), ?>?php>
Скорее всего вы будете использовать движок mysql , поэтому нужно настроить доступы к вашей базе именно для этого движка.
Для этого в подмассиве connections найдите подмассив mysql и введите там доступы к вашей базе:
[ ‘driver’ => ‘mysql’, ‘host’ => env(‘DB_HOST’, ‘127.0.0.1’), ‘port’ => env(‘DB_PORT’, ‘3306’), ‘database’ => env(‘DB_DATABASE’, ‘test’), // ! ‘username’ => env(‘DB_USERNAME’, ‘root’), // ! ‘password’ => env(‘DB_PASSWORD’, ‘root’), // ! ‘unix_socket’ => env(‘DB_SOCKET’, »), ‘charset’ => ‘utf8mb4’, ‘collation’ => ‘utf8mb4_unicode_ci’, ‘prefix’ => », ‘strict’ => true, ‘engine’ => null, ], ?>?php>
После этого перезапустите проект с помощью команды:
php artisan serve
Создайте базу данных через PMA (PhpMyAdmin). Пропишите ее в конфигурации Laravel.
Возможные проблемы
Не факт, что после этого Laravel сможет подключиться к базе. Дело в том, что файл с настройками кешируется и это может привести к проблемам, которые будут выражаться в ошибке Access denied for user ‘homestead’@’localhost’ при попытке подключится к БД.
Решение проблемы описано тут: stackoverflow.com.
Как настроить подключение к базе данных laravel 8?
Установил laravel 8 для экспериментов. Не могу настроить подключение к базе данных. При попытке запустить миграции php artisan migrate , ловлю ошибку (скрин). В файле .env прописана база данных, юзер и пароль. Такая база и юзер с таким паролем есть. Кэш чистил, конфиг чистил. Но вот странно что оно там всегда пишет
Access denied for user 'root'@'localhost' (using password: NO)
хотя юзер и пароль указаны другие. В чем может быть дело?
- Вопрос задан более трёх лет назад
- 551 просмотр
7 комментариев
Простой 7 комментариев