2017-03-13 2 views
0

私はトランザクションを外部に使用しようとしています。私は右の私のインデックスファイルにDBインスタンスを含む場合であるとして、それは動作します:クラスから実体をインスタンス化するときにトランザクションが機能しない

私はその後、別の場所でこのようなコードを使用することができます
use Illuminate\Database\Capsule\Manager as Db; 



$db = new Db; 

$db->addConnection([ 
    'driver' => Settings::DATABASE_DRIVER, 
    'host'  => Settings::DATABASE_HOST, 
    'database' => Settings::DATABASE_NAME, 
    'username' => Settings::DATABASE_USERNAME, 
    'password' => Settings::DATABASE_PASSWORD, 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '' 
]); 

# Make this Capsule instance available globally via static methods... (optional) 
$db->setAsGlobal(); 

Db::connection()->beginTransaction(); 

# Create blog post in the database and return its id 
$blogPostRecordId = (new BlogDbModel())->create($_POST); 
Db::connection()-> rollBack(); 

それが正常に動作し、ロールバックされます:何の行は作成されませんdb。

私はクラスからDBのインスタンスを取得した場合しかし、それは動作しません。

class DbSql 
{ 

    /** 
    * Use the eloquent query builder and orm. Bypass PDO interface. 
    * @return Capsule 
    */ 
    public function db() 
    { 
     $capsule = new Capsule; 

     $capsule->addConnection([ 
      'driver' => Settings::DATABASE_DRIVER, 
      'host'  => Settings::DATABASE_HOST, 
      'database' => Settings::DATABASE_NAME, 
      'username' => Settings::DATABASE_USERNAME, 
      'password' => Settings::DATABASE_PASSWORD, 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '' 
     ]); 

     # Make this Capsule instance available globally via static methods... (optional) 
     $capsule->setAsGlobal(); 

     // Setup the Eloquent ORM... (optional; unless you've used setEventDispatcher()) 
     //$capsule->bootEloquent(); 


     return $capsule; 
    } 
} 

し、それは単に動作しません

(new DbSql())->db()->getConnection()->beginTransaction(); 

# Create blog post in the database and return its id 
$blogPostRecordId = (new BlogDbModel())->create($_POST); 
(new DbSql())->db()->getConnection()->rollBack(); 

を使用してトランザクション無視されます。クラスインスタンシエーションからdbインスタンスを取得すると、プロセスが失敗するのはなぜですか?私は必要に応じてインスタンスを使用することをお勧めします。

答えて

0

ソリューション:DBインスタンスは、トランザクションが必要とされているどこでもまったく同じでなければなりません。そして、

$dbInstance = (new DbSql())->db(); 

トランザクションが従うべきであるところはどこでも$ DBINSTANCEを使用します。

$dbInstance->connection()->beginTransaction(); 

などで任意のDBの雄弁な操作。必要に応じて$ dbInstanceを渡します。 、お使いのモデルでコントローラー....その後

仕上げ:良いことは、それはあなたのコードのどこにでもできることである

$dbInstance->connection()->commit(); 

システムは、この最後の行に達することができない場合には、何がしますdbにコミットしてください。

関連する問題