2015-07-05 21 views

cevap

14

İşte bir çözüm. App\Providers\AppServiceProvider ait boot() yöntemde, ekleyin:

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

Teşekkür @RobertTrzebinski için this blog post için laravel 4.

+1

Çoğu insanın test için sqlite kullandığını varsayarak, test bazında yabancı anahtar kısıtlamalarını gerçekten etkinleştirebilirsiniz. Yabancı_Kadelerin ayarlanması, ayar değiştirilmeden önce hazırlanan ifadeler üzerinde etkili olacağından, bu kodu TestCase'inizdeki bir yardımcı yönteme ekleyebilir ve ihtiyacınız olduğunda arayabilirsin. – jhoff

+0

Laravel 5.5'deyim ve bu çözümle garip bir davranışa sahibim. Çalıştığımda -> attach() ONE modelini diğerine (birçok ilişkiden çok): * PDOException: SQLSTATE [HY000]: Genel hata: 1 böyle bir tablo yok: main.cv * ... ** cvs ** benim masa ve ben deniyorum ** $ this-> cvs() -> ekle ($ cv); ** Birisi benzer bir sorunu var mı? – Jairo

+0

Laravel için çalışmalar 5.6 – bambamboole

6

ilgili Benim için App \ Sağlayıcıları \ AppServiceProvider içinde cephe DB kullanarak laravel 5.2 üretilen hata içinde . Testler aslında yabancı anahtarlarla tablolarda bağlıdır zaman

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

Ayrıca bir test başına (dosya) temelinde yabancı anahtarları aktive olabilir: İşte benim çözümdür.

İşte bir özellik var: (ör tests/ForeignKeys.php)

<?php 

namespace Tests; 

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

test set-up zincirinde bir yere yöntemini çalıştırmak unutmayın. (tests/TestCase.php) o kadar sevdiği testlere ekleyebilirsiniz sonra

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

    ... 

: Ben TestCase için geçersiz kılınmış olarak mayın ekledi

<?php 

namespace Tests\Feature; 

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

class ExampleFeatureTest extends TestCase 
{ 
    use DatabaseMigrations; 
    use ForeignKeys; 

    ... 
0

Ben sadece benim testlerde kullanmak istediğimizden, Bu

:-) bir cazibe gibi çalışır

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

: ancak tüm testlerde, böyle Tests\TestCase sınıfında basit uygulaması ile sona erdi