我想迭代存储在Zend_Db_Table_Rowset对象中的数据行,然后删除/取消设置某些行,如果它们不符合某些条件.
我可以使用toArray()来获取对象中的数据行,然后很容易取消我不需要的行.但由于我想保留我的对象以供进一步使用,我不想这样做.
当然,一种解决方案是调整我的查询以便仅检索我需要的内容,但在这种情况下这是不可能的.至少我不知道怎么做.
我尝试了以下哪些不起作用:
foreach ($rowset as $key => $row)
{
if (!$condition == satisfied)
{
unset($rowset[$key]);
}
}
Run Code Online (Sandbox Code Playgroud)
当然它不起作用,因为没有$ rowset [$ key] ...数据存储在子数组[_data:protected]中但未设置$ rowset [_data:protected] [$ key]没有工作要么.
也许我对行集对象(或一般对象的表示)的概念还不够成熟,无法理解我在做什么.任何澄清和提示都将受到欢迎!
[编辑] $ row-> delete不是一个选项,我不想删除数据库中的行!我不想先创建一个数组,如果我想,我只想做$ rowset-> toArray()[/ EDIT]
解决方案:我最终做了我认为我也无法做到的事情,这意味着我将所有内容集成到初始查询中.
有没有一种从数组自动转换为Zend_Db_Table_Row或Zend_Db_Table_Rowset的方法?
从Zend_Db_Table_Row形式你可以使用toArray()获取数组,但我想知道是否存在与之相反的东西?
到目前为止,我一直在实现一个函数填充($ data),它接受了数组并设置了Zend_Db_Table_Row的属性.
当然,数组键与Zend_Db_Table_Row属性相同.
感谢名单!
我正在实现我的模型,就像快速入门指南一样.
在我的模型中,我试图实现一个findByToken()方法.当前find()方法接受一个$id参数,但我想通过不同列的值来查找.
//excerpt from the quickstart guide
public function find($id, Default_Model_Guestbook $guestbook)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
return;
}
$row = $result->current();
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
}
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的事情,但我觉得它不起作用:
$db = $this->getDbTable();
$where = $db->getAdapter()->quoteInto('token = ?', $token);
$result = $db->find($where);
Run Code Online (Sandbox Code Playgroud)
通过指定列的值查找行的正确方法是什么?
是否有使用Zend从多个数据库表中获取数据的最佳实践?我想知道而不是最终想要重构我在不久的将来编写的代码.我正在阅读Zend文档,它说:
"您无法指定JOINed表中的列以在行/行集中返回.这样做会触发PHP错误.这样做是为了确保保留Zend_Db_Table的完整性.即Zend_Db_Table_Row应仅引用从其派生的列父表."
我假设我因此需要使用多个模型 - 这是正确的吗?例如,如果我想要获取特定用户ID的所有订单,其中日期介于两个日期之间,我该怎么做?
我知道可以从一个控制器访问两个不同的模型,然后在动作中结合它们各自的数据但我不会感到高兴这样做,因为我一直在阅读生存的deepend.com并告诉我我不应该这样做 ......
在哪里,为什么以及如何?:)
谢谢!
我通过扩展Zend_Db_Table_Absract如下(简化示例)创建了Zend Framework模型:
class Foos extends Zend_Db_Table_Abstract
{
protected $_schema = 'Foo';
protected $_name = 'Foos';
protected $_primary = 'id';
protected $_sequence = true;
public function insert($data) {
$db = $this->getAdapter();
$record = array('field1' => $data['field1'],
'field2' => $data['field2'],
...
);
return parent::insert($record);
}
}
Run Code Online (Sandbox Code Playgroud)
以上正确插入记录.问题是,我一直收到以下通知:
Strict Standards: Declaration of Foos::insert() should be compatible with that of Zend_Db_Table_Abstract::insert() in /x/x/x/Foo.php on line XX
Run Code Online (Sandbox Code Playgroud)
据我多次阅读文档和API,我所知道的方式是正确的.我知道我可以关闭,E_STRICT但我更想知道为什么我收到上述通知.有任何想法吗?(PHP 5.3,Zend Framework 1.10)
我需要找到两个日期之间的所有日期; 这是开始日期和结束日期.这是我的查询,但它没有做我需要它做的事情.
在我的表中,我有列名date_created,格式如下2011-06-09 06:41:10.我想删除这部分,06:41:10所以我申请
DATE(date_created)
Run Code Online (Sandbox Code Playgroud)
之后,因为我的日期选择器采用这种格式,02/07/2012我改变了格式DATE_FORMAT().
$start_date and $end_date 是我的变量来比较和格式 02/07/2012
$select = $DB->select()
->from('sms', array(
'sms_id',
'sms_body',
'sms_sender',
'sms_recipient',
'date_created',
'sms_type'))
->where('phone_service_id = ?', $phone_service_id)
->where("DATE_FORMAT(DATE(date_created), '%m/%d/%Y') >= ?", $start_date)
->where("DATE_FORMAT(DATE(date_created), '%m/%d/%Y') <= ?", $end_date)
->order("".$option_call_log." ".$option_call_log_asc_desc);
Run Code Online (Sandbox Code Playgroud)
我在查询中缺少什么?为什么不比较$ start_date和$ end_date?
忘了$option_call_log和$option_call_log_asc_desc.
如果我使用Zend_Db类来从后端数据库中抽象我的查询,那么我使用哪个mysql驱动程序,pdo_mysql与mysqli有什么区别?我对pdo_mysql的理解是它也提供抽象,所以我假设如果我使用Zend_Db,那么我不会利用额外的功能作为mysqli的一部分.但是,从性能的角度来看,一个比另一个更快吗?
当用户打开表单来修改记录时,他只需单击"更新"按钮,而不是更改信息.这导致update()函数返回0.但是,我认为这种情况是一个有效的更新任务.我将如何测试它,以便分配成功消息?
当SQL查询失败或0时,update()是否返回-1?
方法:Zend_Db_Table_Abstract :: update()
有任何想法吗?
谢谢
我认为可以使用Zend_Db_Select或Zend_Db_Table_Abstract编写选择查询,但我不明白何时使用两者中的哪一个.
一个比另一个更优化的东西?与其中一个连接"更容易"吗?
谢谢!
如何从模型中的表中仅选择一个字段.例如:table1(field1, field2 , ..)和select only field 1