我想知道为什么在Zend_Db中你必须使用createRow方法来获取一个新的空Row对象,而不是直接实例化Row对象。
例如,如果我扩展了默认类以创建自己的User表和行类,那么为了创建一个新的行对象,我总是必须执行以下操作来创建一个新的Row对象:
$userTable = new App_Table_User();
$userRow = $userTable->createRow();
$userRow->setName('bob');
$userRow->save();
但对我来说,能够说出来更有意义:
$userRow = new App_Row_User();
$userRow->setName('bob');
$userRow->save();
我知道我总是可以在扩展Zend_Db_Table_Row_Abstract
的Row类中构建这个功能,但是我想知道是否有一个特定的原因,Zend Framework团队不仅仅将它作为默认值?
答案 0 :(得分:4)
可以直接使用new
实例化您的Row类。
但Row对象需要知道哪些列对该行数据有效。
将行的类名映射到其对应的表类名是没有魔力的。因此Row本身并不知道它属于哪个表。因此它无法猜测如何编写SQL来执行插入或更新操作;它从相应的Zend_Db_Table对象获取此元数据。你必须告诉Row要使用哪个表。
如果使用new
构造行对象,则必须将配置数组传递给构造函数,包括表类名,或者该表类的对象实例。
$userRow = new App_Row_User( array('table' => 'App_Table_User') );
或者
$userTable = new App_Table_User();
$userRow = new App_Row_User( array('table' => $userTable) );
如果没有有效的表对象或类名,使用new
实例化Row对象将引发异常。
同样,save()
使用表对象,调用方法insert()
或update()
。如果没有有效的表对象,Row的save()
方法将抛出异常。