2016-09-06 37 views
1

在我的Silex項目中,我使用數據庫抽象層包中的Doctrine查詢生成器。Doctrine查詢生成器和Silex

"doctrine/dbal": "^2.5" 

我將它註冊到我的應用程序容器中,就像這樣。

/** 
* Make a connection to the database. 
*/ 
$app['db'] = function() use($app) { 
    $connectionParams = [ 
     'dbname' => $_ENV['DBNAME'], 
     'user' => $_ENV['DBUSER'], 
     'password' => $_ENV['DBPASS'], 
     'host' => $_ENV['DBHOST'], 
     'driver' => $_ENV['DBDRIVER'], 
    ]; 

    return \Doctrine\DBAL\DriverManager::getConnection($connectionParams); 
}; 

/** 
* Instantiate the query builder 
*/ 
$app['db.builder'] = function() use($app) { 
    return new \Doctrine\DBAL\Query\QueryBuilder($app['db']); 
}; 

當我想查詢數據庫中的記錄,我使用一個倉庫模式,然後注入查詢生成器實例到庫中,然後我使用查詢生成器在我的存儲庫這樣創建的存儲庫。

$app['repository.user'] = function() use($app) { 
    return new App\Repositories\UserRepository($app['db.builder']); 
}; 

$app['repository.book'] = function() use($app) { 
    return new App\Repositories\BookRepository($app['db.builder']); 
}; 

在用戶信息庫我查詢的用戶,以獲取ID之後,我查詢屬於用戶本本的書庫,但問題是,當我使用查詢生成器在圖書庫已經充滿了以前的用戶表。我是否需要重置查詢構建器實例,或者我在將查詢構建器註冊到容器中時做了什麼問題?

+0

什麼是您的硅石版本? –

+0

@MaxP。 「silex/silex」:「〜2.0」 – DB93

回答

2

QueryBuilder已註冊爲常用服務,因此僅創建它的一個實例。如果您在查詢某些書籍之前碰巧填充了任何用戶數據,那就是這樣。

爲避免此問題,您可以將db.builder定義爲工廠服務*。這樣,每次你提出要求的時候,一個新的實例將被創建:

$app['db.builder'] = $app->factory(function() use ($app) { 
    return new \Doctrine\DBAL\Query\QueryBuilder($app['db']); 
}); 

http://silex.sensiolabs.org/doc/master/services.html瞭解更多關於Silex的服務定義。

* http://silex.sensiolabs.org/doc/master/services.html#factory-services

0

默認情況下,服務是共享的,所以當你要求一些服務返回$app['xxx']同一個副本。您應該對容器說,返回服務的函數是一個工廠,以在每次調用時獲得新實例。

$app['db.builder'] = $app->factory(function() use($app) { 
    return new \Doctrine\DBAL\Query\QueryBuilder($app['db']); 
}); 

在任何情況下,查詢生成器將充滿第二次調用庫後的東西,你的情況的版本庫一直和使用查詢生成器的一個副本。最好將db保存在您的存儲庫中,添加方法以獲取新的查詢構建器,並將其用於從數據庫選擇數據的方法中。

$app['repository.book'] = function() use($app) { 
    return new App\Repositories\BookRepository($app['db']); 
}; 

class \App\Repositories\BookRepository 
{ 
    protected $db; 
    protected $table = 'book'; 

    public function __construct($db) 
    { 
     $this->db = $db; 
    } 

    public function getQueryBuilder() 
    { 
     $qb = new \Doctrine\DBAL\Query\QueryBuilder($this->db); 
     $qb->from($this->table); 
     return $qb; 
    } 

    public function find1() 
    { 
     $qb = $this->getQueryBuilder(); 
     $qb...; 
     return...; 
    } 

    public function find2() 
    { 
     $qb = $this->getQueryBuilder(); 
     $qb...; 
     return...; 
    } 
} 

或移至學說ORM