雄辩的关系 - 添加(但不要保存)到belongsToMany

时间:2017-05-09 13:04:27

标签: laravel laravel-5 eloquent

我想创建en Eloquent模型而不立即将其保存到数据库中。但是,我希望包含所有关系,以便使用单个" push()"打电话我可以保存整个结构。

以下示例显示了我要尝试的内容。我设置了以下关系:

class Post extends Eloquent
{
    public function tags()
    {
        return $this->belongsToMany('Tag');
    }
}

class Tag extends Eloquent
{
    public function posts()
    {
        return $this->belongsToMany('Post');
    }
}

非常标准,帖子可以有很多标签,标签可以属于很多帖子。

我知道我现在可以这样做:

//save the post
$post = new Post;
$post->save();

//assign the tag
$post->tags()->save($tag);

然而,我真正想要的是:

//create the post
$post = new Post;

//assign the tag (without saving anything yet!)
$post->tags()->add($tag);

//save the whole thing
$post->push();

相关文档是here,但似乎没有提及"添加"在belongsToMany而不是" save"。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

当您了解

时,这实际上非常简单
$post->tags()->add($tag);

一样。这将访问标记关系ala查询构建器,但您要查看的内容只需将标记添加到您的帖子中。

Laravel并没有内置的方法来处理这个问题,但你可以像这样轻松接近它:

见下文

$post->addTag($tag); // Adding a tag to our tag array


protected $attributes = [
   'tags' => [],    
];

//type hint a tag and push the tag into our tags attribute
public function addTag(Tag $tag) { 
   array_push($this->attributes['tags'], $tag);
}


//Iterate over the tags and attach them to our Post model, 
also save the post model after.

public function push() {
  return collect($this->attributes['tags'])->each(function($tag){
     $this->attach($tag);
  });
  $this->save();
}

我还没有对代码进行测试,但这有望让您走上正确的道路。我也有兴趣知道为什么你发现你的自我推动这个实现?我之前没有找到类似这样的用例,也许可以帮助您找到更标准化的方法来处理您的用例。