我正在尝试使用 Zend Framework 2 在放置在不同数据库中的两个表之间建立连接。
第一个表名为 用户 并存储在数据库中 管理员
第二个表被称为 层次结构并存储在数据库中 客户
我在 global.php 中加载数据库适配器
return array( 'admin' => array( 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=admin;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), ), 'customer' => array( 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=customer;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), ), 'service_manager' => array( 'factories' => array( 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', ), ),
);
但是当我尝试使用此功能加入 UserDao 时:
public function getSelect(Hierarchy $hierarchy) { $select = $this->tableGateway->getSql()->select(); $select->where(array('level' => $hierarchy()->getId())); $select->join(array('h' => 'hierarchies'), 'h.id = users.idHierarchy', array('hierarchyId' => 'id', 'level' => 'level')); return $select; }
这将生成此 SQL 语句:
SELECT "users".*, "h"."id" AS "hierarchyId", "h"."level" AS "level" FROM "users" INNER JOIN "hierarchies" AS "h" ON "h"."id" = "users"."idHierarchy" WHERE "level" = '1'
但是当我尝试使用它时它会抛出这个异常:
Zend\Db\Adapter\Exception\InvalidQueryException SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.hierarchies' doesn't exist
我尝试在连接中指示数据库的名称,如下所示:
$select->join(array('h' => 'customer.hierarchies'), 'h.id = users.idHierarchy', array('hierarchyId' => 'id', 'level' => 'level'));
但它也会抛出这个异常:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.customer.hierarchies' doesn't exist
我发现这个网站解释了我如何做到这一点,但它只对 Zend Framework 1 有效,我正在使用 Zend Framework 2。
Using Different Databases with Zend Framework
有人可以帮助我吗?请。
谢谢!
最佳答案
看起来这个问题是不久前被问到的,但我似乎找到了一个很好的解决方法或解决方案。如果您使用 Zend\Db\Sql\TableIdentifier 和 Zend\Db\Sq\Expression,您将能够解决您的问题。
public function getSelect(Hierarchy $hierarchy) {
$select = $this->tableGateway->getSql()->select();
$select->where(array('level' => $hierarchy()->getId()));
$select->join(
array('h' => new TableIdentifier('hierarchies', 'admin')),
new Expression('h.id = ?', 'users.idHierarchy', Expression::TYPE_IDENTIFIER),
array('hierarchyId' => 'id', 'level' => 'level')
);
return $select;
}
我不确定您的层次结构表在哪个数据库中,所以我现在使用“admin”。您可以将其替换为您拥有的任何数据库名称。看看它是否对你有用,对我来说似乎很好用。
关于zend-framework2 - zf2 在两个不同的数据库之间建立连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15830774/