从多维数组和模型关系中进行有说服力的质量分配


Eloquent mass assignment from multi-dimentional array along with model relationships

我有一个多维数组来自$_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_postauthor之间的关系。如果您定义了一个关系,您将无法保存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;
 }
});