日期之间的ZF2

时间:2014-10-28 19:50:30

标签: php mysql zend-framework2

我无法在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。

2 个答案:

答案 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)

我希望这有帮助