2015-07-05 22 views

Antwort

14

Hier ist eine Lösung. Im boot() Methode von App\Providers\AppServiceProvider hinzu:

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

Dank @RobertTrzebinski für this blog post bezüglich Laravel 4.

+1

Angenommen, die meisten Benutzer verwenden sqlite zum Testen, können Sie die Bedingungen für Fremdschlüssel testweise aktivieren. Da das Setzen von foreign_keys Auswirkungen auf Anweisungen hat, die vor der Änderung der Einstellung vorbereitet wurden, können Sie diesen Code einfach zu einer Hilfsmethode in Ihrem Testfall hinzufügen und bei Bedarf aufrufen. – jhoff

+0

Ich bin in Laravel 5.5 und mit dieser Lösung habe ich ein seltsames Verhalten. Wenn ich versuche -> attach() ein Modell an ein anderes (viele zu viele Beziehung): * PDOException: SQLSTATE [HY000]: Allgemeiner Fehler: 1 keine solche Tabelle: main.cv * ... ** cvs ** ist mein Tabelle und ich versuche ** $ this-> cvs() -> attach ($ cv); ** Jemand hat ein ähnliches Problem? – Jairo

+0

Arbeiten für Laravel 5.6 – bambamboole

6

Für mich eine der Fassade DB im App \ Providers \ AppServiceProvider in Laravel 5.2 erzeugt Fehler mit . Hier ist meine Lösung:

if(config('database.default') == 'sqlite'){ 
    $db = app()->make('db'); 
    $db->connection()->getPdo()->exec("pragma foreign_keys=1"); 
} 
0

Sie auch Fremdschlüssel auf einer Pro-Test (Datei) Basis aktivieren könnten, wenn die Tests hängen tatsächlich auf Tabellen mit Fremdschlüsseln.

Hier ist ein Merkmal: (z tests/ForeignKeys.php)

<?php 

namespace Tests; 

trait ForeignKeys 
{ 
    /** 
    * Enables foreign keys. 
    * 
    * @return void 
    */ 
    public function enableForeignKeys() 
    { 
     $db = app()->make('db'); 
     $db->getSchemaBuilder()->enableForeignKeyConstraints(); 
    } 
} 

vergessen Sie nicht die Methode irgendwo in Ihrer Test-Set-up-Kette zu laufen. Ich habe meine als Überschreibung zu meinem Testfall: (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(); 
     } 
    } 

    ... 

nach, dass Sie es zu Ihren Tests wie so hinzufügen:

<?php 

namespace Tests\Feature; 

use Tests\ForeignKeys; 
use Tests\TestCase; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 

class ExampleFeatureTest extends TestCase 
{ 
    use DatabaseMigrations; 
    use ForeignKeys; 

    ... 
0

Da ich nur diese in meinen Tests verwenden möge, aber in allen Tests, landete ich mit einer einfachen Implementierung in der Tests\TestCase Klasse wie folgt auf:

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

Dies funktioniert wie ein Charme :-)