在数据透视表中更改自己的ID

时间:2017-02-07 13:54:40

标签: php laravel eloquent

我正在开发一个Laravel应用程序,其中我有一个posts表,一个tags表和一个post_tag表作为数据透视表。

现在我需要将帖子中的所有标签提供给另一个帖子。换句话说,我需要做出:

$tags = $post->tags;

将post_id更改为数据透视表中的每条记录。我已经设定了所有的关系。

编辑:这是我的代码

class Post extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class)->withPivot('is_active')->withTimestamps();
    }

}

class Tag extends Model { }

主要问题是我必须保持is_active值不变。我只需要从数据透视表中替换post_id,其中post_id等于我想要覆盖的那个(我知道我可以创建一个原始查询,但我试图避免它)

编辑2

我让它以这种方式工作,但我仍然更喜欢面向对象的方式

DB::table('post_tag')->where('post_id', $post_a->id)->update(['post_id' => $post_b->id]);

2 个答案:

答案 0 :(得分:0)

尝试类似

的内容
$tags = $post->tags;

//convert tags to IDs only for upcoming steps
... //an array of IDs

$post->tags()->sync($tags); //remove the tags from this post
$post2->tags()->sync($tags); // add the tags to this post

这可以让你走到正确的轨道。

<强>更新

如果它只有一个,那就可以了

$post2->tags()->attach($tag, ['is_active' => true]);
$post2->tags()->->sync([1 => ['is_active' => true], 2 => ['is_active' => true]);

您可以尝试调整上面的示例。 但我不知道如何使用一系列ID来完成它。

答案 1 :(得分:0)

您可以使用lalovel文档中的Eloquent方法updateExistingPivot

  

如果需要更新数据透视表中的现有行,可以使用updateExistingPivot方法。此方法接受数据透视记录外键和要更新的属性数组:

$user = App\User::find(1);

$user->roles()->updateExistingPivot($roleId, $attributes);