Laravel 5.1:启用SQLite外键约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.1:启用SQLite外键约束相关的知识,希望对你有一定的参考价值。

在SQLite中,外键约束是disabled by default

配置Laravel 5.1的SQLite数据库连接以启用外键约束的最佳方法是什么?我没有在['connections']['sqlite']/config/database.php看到这样做的方法。

答案

这是一个解决方案。在boot()AppProvidersAppServiceProvider方法中,添加:

if (DB::connection() instanceof IlluminateDatabaseSQLiteConnection) {
    DB::statement(DB::raw('PRAGMA foreign_keys=1'));
}

感谢@RobertTrzebinski为this blog post关于Laravel 4。

另一答案

对我来说,使用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");
}
另一答案

因为我只想在我的测试中使用它,但在所有测试中,我最终在TestsTestCase类中使用了这样一个简单的实现:

 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();
        }
}

这就像一个魅力:-)

另一答案

当测试实际上依赖于具有外键的表时,您还可以基于每个测试(文件)激活外键。

这是一个特点:(例如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 PHPUnitFrameworkTestCase
 */
abstract class TestCase extends IlluminateFoundationTestingTestCase
{
    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 TestsFeature;

use TestsForeignKeys;
use TestsTestCase;
use IlluminateFoundationTestingDatabaseMigrations;

class ExampleFeatureTest extends TestCase
{
    use DatabaseMigrations;
    use ForeignKeys;

    ...

以上是关于Laravel 5.1:启用SQLite外键约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.1 完整性约束违规中添加外键:1452?

如何在 laravel 5.1 迁移中使用外键

外键约束问题(分层数据)

如何向现有 SQLite 表添加外键?

在没有命令的情况下启用 SQLite 外键

如何通过 Java 在 SQLite 中强制执行外键约束?