2013-03-05 59 views
1

我想在zf2中執行自定義查詢。現在我有一個相冊控制器和AlbumTable。在AlbumTable裏面,我想要執行一個連接操作。但我無法做到這一點。請給我一些建議。用zend框架編寫自定義查詢2

下面我的代碼:

namespace WebApp\Table; 

use Zend\Db\TableGateway\TableGateway; 
use Zend\Db\Sql\Sql; 

new Zend\Db\Adapter\Adapter; 

class UserTable 
{ 

    protected $tableGateway; 

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

    public function searchUser($search) 
    { 

    $search = "mehedi"; 
    $adapter = new Adapter(); 
    $sql  = new Sql($adapter); 
    $select = $sql->select(); 
    $select->from('foo'); 
    $select->join('profiles', 'user.user_id = profiles.ownerId', array('name')); 
    $select->where(array('id' => 2)); 
    $statement = $sql->prepareStatementForSqlObject($select); 
    $results = $statement->execute(); 
    return $results; 
    } 

} 

回答

1

的問題是你想不帶任何參數來實例適配器,當它至少需要一個驅動程序:

$adapter = new Adapter(); // Bad 
$adapter = new Adapter($driver); // .. 

您應該使用ServiceManager來獲取您的適配器,您是否從骨架應用程序開始?

應該已經注入TableGateway爲你..

$adapter = $this->getAdapter(); 

實例的適配器的例子:

$config = $serviceLocator->get('Config'); 
$adapter = new Adapter($config['db']); 

,您可以指定你的配置,local.php裏面你的設置將這樣做:

return array(
    /** 
    * Database Config 
    */ 
    'db' => array(
     'driver' => 'pdo', 
     'dsn'  => 'mysql:dbname=dbname;host=localhost', 
     'username' => 'root', 
     'password' => 'password', 
    ), 
+0

in line $ adapter = new Adapter($ driver);我如何獲得$驅動程序。請你簡單介紹一下。 – nopaws 2013-03-11 06:38:57

+0

爲你更新了答案。 – Andrew 2013-03-11 09:05:59

+0

Thans Andrew爲你提供了很好的答案。 – nopaws 2013-03-14 04:25:49

0

這是因爲聯接方法需要對連接表的數組。此外,我個人會前綴查詢表中,這樣的事情: -

$search = "mehedi"; 
$adapter = new Adapter(); 
$sql  = new Sql($adapter); 
$select = $sql->select(); 
// PREFIXED THE foo table f 
$select->from(array('f' =>'foo')); 
// PREFIXED THE profiles table p 
$select->join(array('p' => 'profiles'), 'user.user_id = profiles.ownerId', array('name')); 
$select->where(array('id' => 2)); 
$statement = $sql->prepareStatementForSqlObject($select); 
$results = $statement->execute(); 
return $results; 
+0

實際上這個問題與Alias並不完全相關。你可以做同樣的操作而不用別名。主要問題是無法創建適配器的實例。由於所有實體(表實體)都必須使用tablegateway,所以$ adapter = $ this-> tableGateway-> getAdapter();是初始化適配器實例的最佳方法。 – nopaws 2013-03-14 04:24:35

1

我得到了這個問題的一些解決方案,幫助所有的h ERE。

$adapter = $this->tableGateway->getAdapter(); 

    /* $adapter variable is used to fetch Adapter 
    configuration from serivce manager. */ 

    $sql  = new Sql($adapter); 
    $select = $sql->select(); 
    $select->from('foo'); 
    $select->join('profile', 'foo.skillId = profile.id', array('name')); 

    $statement = $sql->prepareStatementForSqlObject($select); 
    $results = $statement->execute(); 

    /* if you want you can see your 
    desired output in here. */ 

    foreach ($results as $person) { 
     echo "<pre>"; 
     print_r($person); 
    } 

    return $results;