В SQLite ограничения по внешним ключам по умолчанию отключены .
Каков наилучший способ настроить соединение базы данных Litevel 5.1 с базами данных SQLite для ограничения внешних ключей? Я не вижу способа сделать это в ['connections']['sqlite']
в /config/database.php
.
Вот одно решение. В методе boot()
App\Providers\AppServiceProvider
добавьте:
if (DB::connection() instanceof \Illuminate\Database\SQLiteConnection) { DB::statement(DB::raw('PRAGMA foreign_keys=1')); }
Спасибо @RobertTrzebinski за это сообщение в блоге относительно Laravel 4.
Для меня, используя DB-фасад в App \ Providers \ AppServiceProvider в Laravel 5.2, возникла ошибка. Вот мое решение:
if(config('database.default') == 'sqlite'){ $db = app()->make('db'); $db->connection()->getPdo()->exec("pragma foreign_keys=1"); }
Вы также можете активировать внешние ключи на основе каждого теста (файла), когда тесты фактически зависят от таблиц с внешними ключами.
Вот черта: (например, tests/ForeignKeys.php
)
<?php namespace Tests; trait ForeignKeys { /** * Enables foreign keys. * * @return void */ public function enableForeignKeys() { $db = app()->make('db'); $db->getSchemaBuilder()->enableForeignKeyConstraints(); } }
не забудьте запустить метод где-то в вашей тестовой установочной цепочке. Я добавил мое в качестве переопределения к моей TestCase: ( tests/TestCase.php
)
<?php namespace Tests; /** * Class TestCase * @package Tests * @mixin \PHPUnit\Framework\TestCase */ abstract class TestCase extends \Illuminate\Foundation\Testing\TestCase { use CreatesApplication; ... /** * Boot the testing helper traits. * * @return array */ protected function setUpTraits() { $uses = parent::setUpTraits(); if (isset($uses[ForeignKeys::class])) { /* @var $this TestCase|ForeignKeys */ $this->enableForeignKeys(); } } ...
после этого вы можете добавить его в свои тесты следующим образом:
<?php namespace Tests\Feature; use Tests\ForeignKeys; use Tests\TestCase; use Illuminate\Foundation\Testing\DatabaseMigrations; class ExampleFeatureTest extends TestCase { use DatabaseMigrations; use ForeignKeys; ...