[英]Laravel 5.1: Enable SQLite foreign key constraints
SQLite,默认关闭外键约束。
配置Laravel 5.1的SQLite数据库连接启用外键约束的最佳方式是什么? 我在/config/database.php
['connections']['sqlite']
中看不到这样做的方法。
这是一个解决方案。 在App\\Providers\\AppServiceProvider
的boot()
方法中,添加:
if (DB::connection() instanceof \Illuminate\Database\SQLiteConnection) {
DB::statement(DB::raw('PRAGMA foreign_keys=1'));
}
对我来说,在Laravel 5.2的App \\ Providers \\ AppServiceProvider中使用Facade DB会产生错误。 这是我的解决方案:
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;
...
因为我只想在测试中使用它,但是在所有测试中,我最终在Tests\\TestCase
类中实现了一个简单的实现,如下所示:
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
protected function setUp()
{
parent::setUp();
$this->enableForeignKeys();
}
/**
* Enables foreign keys.
*
* @return void
*/
public function enableForeignKeys()
{
$db = app()->make('db');
$db->getSchemaBuilder()->enableForeignKeyConstraints();
}
}
这就像一个魅力:-)
在 laravel 的较新版本中,特别是 8.x 和 9.x,有一个配置选项可以为 SQLite 数据库打开外键约束。
config/database.php
<?php
use Illuminate\Support\Str;
return [
// ...
'connections' => [
'testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
// here
'foreign_key_constraints' => true,
],
],
// ...
];
就我而言,我只是没有为测试数据库设置该选项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.