繁体   English   中英

Laravel 5.1:启用SQLite外键约束

[英]Laravel 5.1: Enable SQLite foreign key constraints

SQLite,默认关闭外键约束。

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

这是一个解决方案。 App\\Providers\\AppServiceProviderboot()方法中,添加:

if (DB::connection() instanceof \Illuminate\Database\SQLiteConnection) {
    DB::statement(DB::raw('PRAGMA foreign_keys=1'));
}

感谢@RobertTrzebinski撰写有关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");
}

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

这是一个特征:(例如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM