我正在考虑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
质量分配在相关模型中根本不起作用吗?
或者它是否正常工作,但与morphMany关系无关?
我是否误解了$model->push()
或$model::create
?
提前致谢。
答案 0 :(得分:1)
与SO问题一样,写作和格式化让我有时间思考......
$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();
作品!但感觉有点hackish。还有更多......" Eloquent"批量分配相关模型的方式?
编辑:这可能是一般正确的行动方案 - 质量分配不会处理关系,但至少我可以单独分配每个模型。
我只需要稍微改变输入,一旦验证被添加到等式中,我可能不得不这样做。
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;
}
现在我觉得我正在使用全力!