我无法在Zend Framework 2中的两个日期之间成功检索记录。
我的代码如下:
$select = $this->getTimeTable();
$predicate = new \Zend\Db\Sql\Where();
$select->where($predicate->between("start_date", $week_sunday_date , $satruday_date));
public function getTimeTable()
{
if (!$this->timeTable)
{
$this->timeTable = new TableGateway(
'time',
$this->getServiceLocator()->get('Zend\Db\Adapter\Adapter')
);
}
return $this->timeTable;
}
"起始日期"是我的数据库中DATETIME类型的列,$ week_sunday_date,$ satruday_date都生成如下
$week_sunday_date = date("Y-m-d\TH:i:sP",strtotime('this sunday'));
$satruday_date = date("Y-m-d\TH:i:sP",strtotime("+6 day", strtotime($week_sunday_date)));
数据库连接很好,否则我可以获取数据。将$ week_sunday_date和$ satruday_date变量转储到上面我看到:
string(25)" 2014-11-08T00:00:00 + 00:00" string(25)" 2014-11-02T00:00:00 + 00:00"
我还尝试了其他几种方法,但最终页面空白,由于错误而无法加载。
好像我需要这样的东西:
$statement = $sql->prepareStatementForSqlObject($select);
$time_list = $statement->execute();
但不确定如何正确初始化$ sql。
答案 0 :(得分:2)
我认为正确的语法是:
$select->where->between('start_date', $week_sunday_date, $saturday_date);
哦,但是,在你的情况下,$select
是TableGateway的一个实例,那么你可能需要$select->getSql()->where->between(...)
。
我在TableGateway上有点生疏,我们已经偏离了使用它。但我认为你可以这样做:
$timeTable = new TableGateway(/*...*/);
$select = $timeTable->getSql()->select();
$select->columns(array('col1', 'col2'));
$select->where->between('start_date', $week_sunday_date, $saturday_date);
$resultSet = $timeTable->selectWith($select);
var_dump($resultSet->toArray());
注意:我不建议始终将结果集转换为数组,但能够为调试目的这样做很好。
不使用TableGateway的示例:
查询类:
namespace Example\Model\Sql\Select;
use Zend\Db\Sql\Select;
class Time extends Select {
public function __construct($week_sunday_date, $saturday_date) {
parent::__construct(['t' => 'Time']);
$this->columns([
'col1',
'col2',
]);
$this->where->between('start_date', $week_sunday_date, $saturday_date);
}
}
数据模型:(基本上是一个美化的数组对象,只保存数据,没有业务逻辑)
namespace Example\Model\DataContainer;
class Time extends \ArrayObject {
protected $col1;
protected $col2;
public function exchangeArray($data) {
$this->col1 = $data['col1'];
$this->col2 = $data['col2'];
}
public function getCol1() {
return $col1;
}
public function getCol2() {
return $col2;
}
}
<强>控制器:强>
namespace Example\Controller;
use Example\Model\DataContainer;
use Example\Model\Sql\Select;
use Zend\Db\ResultSet\ResultSet;
class IndexController {
public function myExampleAction() {
$request = $this->getRequest();
$sm = $this->getServiceLocator();
$query = new Select\Time($request->getQuery('sunday'), $request->getQuery('saturday'));
$resultSet = new ResultSet(ResultSet::TYPE_ARRAYOBJECT, new DataContainer\Time());
$executer = $sm->get('Executer');
$resultSet = $executer->execute($query, $resultSet);
return [
'time' => $resultSet, // loop through results in your view
];
}
}
因此,我们创建了一个查询类的实例,该实例是在通过创建它的新实例隐式调用构造函数时设置的。我们将参数传递给它。然后,我们创建一个结果集类的实例,并指定数组对象原型。我们的查询返回的每一行都将被填充为数组对象原型的一个实例。初始化结果集时,它将自动使用为当前行返回的数据调用exchangeArray()
。该方法填充数据容器,因此结果集中填充了这些填充数据容器对象的数组。因此,当您循环遍历结果集时,每一行都将由数组对象原型的实例表示。
您必须定义自己的Executer类。那不是内置的。您将不得不创建它并将其添加到服务配置中,以便您可以像在示例中所做的那样将其从服务管理器中取出。
答案 1 :(得分:0)
您在问题结束时请求的$ sql属性的快速示例。 你应该使用: 使用Zend \ Db \ Sql \ Sql; 使用Zend \ Db \ Sql \ Select;
$adapter = $this->tableGateway->getAdapter();//get connection
$sql = new Sql($adapter);
$select = $sql->select();
$select->from($this->tableGateway->getTable())->where(array('active' => '1'));
$selectString = $sql->getSqlStringForSqlObject($select);
//echo $selectString;die;//this will show the quesry string build above.
$results = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
$resultSet = new ResultSet();
$resultSet->initialize($results);
return $resultSet->toArray();//return array(use $resultSet->current() for one row)
我希望这有帮助