Laravel使用morphMany关系保存质量赋值

时间:2014-11-09 14:23:29

标签: php laravel eloquent polymorphic-associations

我正在考虑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

提前致谢。

1 个答案:

答案 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;
}

现在我觉得我正在使用全力!