Я смотрю на массовое назначение в 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
?
Заранее спасибо.
Как и часто с ТАКИМИ вопросами, написание и форматирование дали мне время подумать ..
$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;
}
Теперь я чувствую, что использую всю мощь!
Других решений пока нет …