Laravel 5.1: включение ограничений внешнего ключа SQLite

В 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; ...