在 Datamapper ORM 中循环更改对象
Posted
技术标签:
【中文标题】在 Datamapper ORM 中循环更改对象【英文标题】:changing object in loop in Datamapper ORM 【发布时间】:2011-05-11 18:00:03 【问题描述】:我正在尝试在 Codeigniter 的 Datamapper 中保存一个长表单。如果我传递这样的值,我可以保存表单
$t->brandName = $this->input->post('brandName');
$t->specialNotes = $this->input->post('specialNotes');
$t->name = $this->input->post('name');
现在如果我调用 save 方法就可以了
$t->save();
由于表单很大,我尝试在 foreach 中添加对象值
$a = get_object_vars($t);
foreach ($a['stored'] as $k => $val)
$t->$k = $this->input->post("$k");
但是,如果我打电话给$t->save()
,它就不起作用了。
【问题讨论】:
【参考方案1】:我不确定$a['stored']
代表什么,但这不是 Datamapper 中的默认设置。
你为什么不做相反的事情,循环通过帖子键?
foreach ($_POST as $key => $val)
$t->$key = $this->input->post($key);
$t->save();
注意:Datamapper 将忽略任何不存在的列。
我实际上为此编写了一个 Datamapper 扩展:
class DM_Data
function assign_postdata($object, $fields = NULL)
// You can pass a different field array if you want
if ( ! $fields)
$fields = $object->validation;
foreach ($fields as $k => $data)
$rules = isset($data['rules']) ? $data['rules'] : array();
if ( ! isset($_POST[$k])) continue;
// Cast value to INT, usually for an empty string.
if (in_array('integer', $rules))
$object->$k = (integer) $_POST[$k];
// Do other manipulation here if desired
else
$object->$k = $_POST[$k];
return $object;
您可以使用$t->assign_postdata()->save()
,并可选择传递一个字段数组以更新到函数(以数据映射器验证格式)。但是,我忘记了为什么要使用它……但是我删除了一些自定义内容。如果您经常这样做,这应该对您有用。这绝对节省了我的时间。
【讨论】:
@MakDotGNU:我添加了一些您可能感兴趣的代码。 谢谢@wesley,这对我有帮助。以上是关于在 Datamapper ORM 中循环更改对象的主要内容,如果未能解决你的问题,请参考以下文章
ORM/DAO/DataMapper/ActiveRecord/TableGateway 的区别?
Codeigniter Datamapper ORM php 7静态问题
DataMapper ORM - 如何获取所有模型和每个实例的相关数据