我有一个多维数组来自$_POST
。它的键与blog_posts
表中的列或其关系的名称(例如author
)完全相同。
我想将$_POST批量分配给匹配对象及其关系。例子:
$_POST = array (
'blog_post' => array (
'title' => 'the title of the post',
'content' => 'the content of the post',
'date' => '23-09-2015',
'author' => array (
'name' => 'hydra',
'age' => 47,
'location' => 'Russia',
),
),
);
将被映射到一个blog_post
对象和一个author
对象。
需要注意的两点:
- 这只是一个例子,我不知道我将使用什么类型的对象;
- 解决方案也应该可用于对象集合
我目前(显然不起作用)的解决方案包括:
array_walk($_POST, function(value, key){
if (is_array($value) && class_exists($key)) {
$object = new $key($value);
$object->save();
}
});
这只保存第一个对象(blog_post
)。
编辑:安全不是我现在关心的,我将在插入之前消毒$_POST,但主要问题是批量分配,而不必知道我使用哪个类和手动分配关系。
看起来你错过了blog_post
和author
之间的关系。如果您定义了一个关系,您将无法保存author
,因为它将丢失一个必需的外键。
$parent = null;
array_walk($_POST, function(value, key){
if (is_array($value) && class_exists($key)) {
$object = new $key($value);
if(!empty($parent)){
$parent->$key()->save($object); // function author(){$this->hasOne('author');} on blog_post model
}
else{
$object->save();
}
$parent = $object;
}
});