Laravel, сохраняющий массовое назначение с отношением morphMany

Я смотрю на массовое назначение в Laravel и пытаюсь массово назначить данные как для одной модели, так и для связанной с ней модели.

Мои модели:

class News extends Eloquent {
protected $table = 'news';
protected $fillable = array(
'title', 'slug', 'author', 'img', 'content',
);
public function content() {
return $this->morphMany('Content', 'morphable')->orderBy('section');
}
}

class Content extends Eloquent {
protected $table = 'contents';
protected $fillable = array(
'rawText', 'section',
);
public function morphable() {
return $this->morphMany();
}
}

Мой вклад

я имею Input:all() выглядит так, исходя из формы:

array(6) {
["_token"]=>
string(40) "irrelevant"["title"]=>
string(11) "Happy Title"["author"]=>
string(9) "Mr. Happy"["slug"]=>
string(11) "happy-title"["img"]=>
string(9) "happy.png"["content"]=>
array(1) {
[0]=>
array(2) {
["section"]=>
string(4) "body"["rawText"]=>
string(27) "# I'm happy!   ## So happy"}}}

Что мне теперь делать, чтобы сохранить данные в виде двух новых строк базы данных? (один в новостях, один в содержании)

Я думал, что теперь это будет так просто, как:

$news = News::create(Input::all());
$news->push();

Но я явно что-то упускаю.

Я получаю ошибку: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array

Массовое назначение не работает вообще с родственными моделями?

Или все работает нормально, но не с морфминовыми отношениями?

Я неправильно понял $model->push(), или же $model::create ?

Заранее спасибо.

2

Решение

Как и часто с ТАКИМИ вопросами, написание и форматирование дали мне время подумать ..

$input = Input::all();
$contents = Input::get('content');
unset($input['content']);
$news = News::create($input);
foreach ($contents as $c) {
$content = Content::create($c);
$news->content()->save($content);
}
$news->save();

Работает! Но чувствует себя немного хакером. Есть ли более .. «красноречивый» способ массового присвоения родственных моделей?

Редактировать: Вероятно, это, в общем, правильный путь действий: массовое назначение не будет обрабатывать отношения, но, по крайней мере, я могу назначить каждую модель отдельно.

Мне просто нужно немного поработать с вводом, что мне, вероятно, придется сделать в любом случае, как только проверка будет добавлена ​​в уравнение.

Edit2: Имея большой успех, можно переместить логику связанной модели в эту модель и сделать ее простой, например:

$input = Input::all();
unset($input['content']);
$news = News::create($input);
$news = Content::updateAll($news, true);
$news->save();

за создание, а также:

$input = Input::all();
unset($input['content']);
$news = News::find($id)->fill($input);
$news = Content::updateAll($news, false);
$news->save();

за обновление.

updateAll() Метод, для всех, кто заинтересован:

public static function updateAll($model, $create = false) {
$contents = Input::get('content');
foreach ($contents as $k => $c) {
// Save against parent model
if ($create) {
$content = Content::create($c);
} else {
$content = Content::find($k)->fill($c);
}
$model->content()->save($content);
}
return $model;
}

Теперь я чувствую, что использую всю мощь!

1

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

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

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