2013-03-05 67 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;