zf2 make a join between two different databases

后端 未结 5 1847
感情败类
感情败类 2021-01-13 16:31

I am trying to make a join between two tables placed in different databases with Zend Framework 2.

The first table is called users and is stored in

相关标签:
5条回答
  • 2021-01-13 16:40

    As Dan has answered, but for Zend 2.3 you should change line 742 in file Zend\Db\Sql\Select.php from

    $joinName = $platform->quoteIdentifier($joinName);
    

    to

    $joinName = $platform->quoteIdentifierInFragment($joinName);
    

    and line 680 from

    $name = $platform->quoteIdentifier($name);
    

    to

    $name = $platform->quoteIdentifierInFragment($name);
    


    Obs: These are only the lines that I could identify, and may not be a complete list.

    0 讨论(0)
  • 2021-01-13 16:41

    Looks like this question was asked a while back, but I seem to have found a good workaround or solution. If you utilize the Zend\Db\Sql\TableIdentifier and Zend\Db\Sq\Expression, you will be able to get around your issue.

    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;
    }
    

    I wasn't sure which database your hierarchies table is in so I used 'admin' for now. YOu can replace it with which ever database name you have. See if it works for you, seems to work nicely for me.

    0 讨论(0)
  • 2021-01-13 16:49

    The issue is occurring because of the way the Select class escapes quotes.

    $select->join("database2.table2", "database2.table2.id = table.id")

    Is rendered as:

    SELECT 'table'.* 'database2.table2'.* FROM 'table' INNER JOIN 'database2.table2' ON 'database2'.'table2'.'id' = 'table'.'id'

    Note the inconsistant and incorrect quoting around "database2.table2".

    Updating lines 596, 599, 624, 625 in \Zend\Db\Sql\Select to replace the "quoteIdentifier" method with "quoteIdentifierInFragment" renders the query correctly and allows a cross database join to be performed.

    I've submitted an issue report to Zend as I don't believe the current behaviour is intended so hopefully it will be updated in a future build. For now it's easy enough (though admittedly a little dirty) to update the class manually.

    https://github.com/zendframework/zf2/issues/4307

    0 讨论(0)
  • 2021-01-13 16:58

    The framework does not support a join with another database. You have to use plain SQL for building the query.

    0 讨论(0)
  • 2021-01-13 16:58

    Why you're using DAO concept? Only in a table gateway you'll have all of you'll need. You already have adapters in global or local.php. You already have factories for table gateways, haven't you? Why you need to pass Hierarchy class (I think it is another table gateway) to the current class? To do the join that you want, the only thing that you need is table identifier.

    $table2 = new Zend\Db\Sql\TableIdentifier('table2', 'schema_name'); 
    $select = $this->tableGateway->getSql()->select()
    ->join($table2, 'table1.field = table2.field', ['fields_from_table2'], 'INNER');
    
    $sql = new Sql($this->tableGateway->getAdapter());
    $selectString = $sql->buildSqlString($select);
    $result = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
    

    See the answer for this question

    0 讨论(0)
提交回复
热议问题