Красноречивое присвоение массы из многомерного массива вместе с модельными связями

У меня есть многомерный массив из $_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 объект.

2 вещи, которые нужно иметь в виду:

  • это только пример, я понятия не имею, с какими типами объектов я буду работать;
  • решение также должно использоваться с коллекциями объектов

мое текущее (очевидно, нерабочее) решение будет включать:

array_walk($_POST, function(value, key){
if (is_array($value) && class_exists($key)) {
$object = new $key($value);
$object->save();
}
});

Это только сохраняет первый объект (blog_post).

Редактировать: безопасность не моя проблема в данный момент, я буду дезинфицировать $ _POST перед вставкой, но основной проблемой является массовое назначение без необходимости знать, какой класс я использую, и назначать отношения вручную.

1

Решение

Похоже, вам не хватает отношений между 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;
}
});
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]