Где в laravel подключение к бд
Перейти к содержимому

Где в laravel подключение к бд

  • автор:

Основы работы с базами данных

Этот перевод актуален для англоязычной документации на 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

  1. Выпуски 4.x/5.x
  2. Обновление до новой версии
  3. Помощь проекту

Руководства:

Основы архитектуры:

  1. Поставщики услуг
  2. Сервис-контейнеры
  3. Контракты
  4. Фасады
  5. Прохождение запроса
  6. Структура приложения
  1. Аутентификация
  2. Авторизация (5.1+)
  3. Оплата (биллинг)
  4. Кэш
  5. Коллекции
  6. Командная шина
  7. Расширение фреймворка
  8. Elixir
  9. Шифрование
  10. Envoy
  11. Scout
  12. Ошибки и журнал
  13. События
  14. Файловая система и облака
  15. API Authentication (Passport)
  16. Хэширование
  17. Функции
  18. Локализация
  19. Работа с e-mail
  20. Разработка пакетов
  21. Страничный вывод
  22. Очереди
  23. Сессии
  24. Шаблоны Blade (5.1+)
  25. Шаблоны (5.0)
  26. Планировщик
  27. Юнит-тесты
  28. Проверка ввода
  29. JavaScript и CSS
  30. Сброс пароля

Базы данных:

Eloquent ORM

  1. Основы командного интерфейса
  2. Создание команд

Статистика: Символов — 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’), ?>

Скорее всего вы будете использовать движок 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 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)

хотя юзер и пароль указаны другие. В чем может быть дело?

5f71903a038af769828343.png

5f719044e5654528395761.png

  • Вопрос задан более трёх лет назад
  • 551 просмотр

7 комментариев

Простой 7 комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *