ZF2:DB \ AbstractTableGateway:如何使用JOIN?

时间:2013-09-06 14:17:14

标签: zend-framework2

我是ZF新手,下面有代码。我尝试获取自定义列并加入sql select,但它失败了。 我试图使用搜索但没有找到结果。 告诉我如何进行更复杂查询的示例。 感谢。

<?php

namespace FcFlight\Model;

use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\Db\Adapter\Adapter;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\Sql\Select;
use FcFlight\Filter\FlightHeaderFilter;

class FlightHeaderModel extends AbstractTableGateway
{

/**
 * @var string
 */
protected $table = 'flightBaseHeaderForm';

/**
 * @param \Zend\Db\Adapter\Adapter $adapter
 */
public function __construct(Adapter $adapter)
{
    $this->adapter = $adapter;
    $this->resultSetPrototype = new ResultSet();
    $this->resultSetPrototype->setArrayObjectPrototype(new FlightHeaderFilter($this->adapter));
    $this->initialize();
}

/**
 * @param $id
 * @return array|\ArrayObject|null
 * @throws \Exception
 */
public function get($id)
{
    $id = (int)$id;
    $rowSet = $this->select(array('id' => $id));
    $row = $rowSet->current();
    if (!$row) {
        throw new \Exception("Could not find row $id");
    }
    $row->dateOrder = date('Y-m-d', $row->dateOrder);

    return $row;
}
}

1 个答案:

答案 0 :(得分:4)

由于您使用的是tableGateway,因此必须获取Sql()的实例:$this->getSql();

使用该实例,您将创建一个Select实例,然后让您执行连接:

$sql = $this->getSql();
$select = $sql->select();
$select->join('TableNameToJoin', 'MainColumnA = JoinColumnA');

然后执行查询,在tableGateway上调用selectWith:

$this->selectWith($select);

如果您希望进一步自定义联接,可以再传递两个:

  • 您要选择的列数组
  • 您希望进行的联接类型(例如LEFT JOIN)

您还可以通过将Array作为表名称添加到要加入的表中的别名,其中数组的key是别名,value是表名。

$select->join(['Alias' => 'TableNameToJoin'], 'MainColumnA = Alias.JoinColumnA', ['ColumnA', 'ColumnB'], $select::JOIN_LEFT);