【问题标题】:Laravel 5 Pivot table only saving first recordLaravel 5 Pivot 表只保存第一条记录
【发布时间】:2015-09-06 13:59:19
【问题描述】:

我有一个表,它只包含其他两个表的 id,我想要一个 n:m 关系,但现在每次我保存一条记录时,如果两个 id 之一已被使用,它会删除前一个记录。

我的迁移:

    Schema::create('show_user', function(Blueprint $table) {
        $table->integer('show_id')->unsigned()->index();
        $table->foreign('show_id')->references('id')->on('shows');
        $table->integer('user_id')->unsigned()->index();
        $table->foreign('user_id')->references('id')->on('users');
    });

我的模特:

用户

public function shows()
{
    return $this->belongsToMany('App\Show');
}

节目

public function users()
{
    return $this->belongsToMany('App\User');
}

这就是我保存到数据透视表的方式:

User::find($userid)->shows()->sync([$showid, $userid])

当我在节目 5 上为用户 1(我)执行此操作时,它会保存 1 和 5,当我在节目 12 上为同一用户再次尝试时,它会保存 1 和 12,并从之前删除 1 和 5 记录.如果我通过 phpMyAdmin 手动插入,我可以添加多条记录,但不能使用同步。我也试过这个,结果相同:

User::find($userid)->shows()->sync([$showid])

【问题讨论】:

  • 试试attach() 而不是sync()

标签: mysql laravel eloquent laravel-5


【解决方案1】:

您没有正确使用sync()sync() 用于从User 添加和删除 Shows,并期望Show ids 的数组。因此,如果您调用 sync([1,5]),您会将 ids 的 1 和 5 添加到 User,并删除之前与该 User 关联的所有其他 Shows

你可以阅读inserting related-models in Laravel here,但你可能只需要知道这三个例子:

如果UserShows 3、4 和8 有关系,并且您想确保User 只与Shows 4 和5 有关系,您可以这样做:

User::find($userid)->shows()->sync([4,5]); // Removes 3 and 8; Adds 5

如果User 已经与Show 4 有关系,并且您想添加Show 5,您可以这样做:

User::find($userid)->shows()->attach(5); // Adds 5

如果 UserShows 3、4、5 和 8 有关系,并且您想删除 3 和 8,您可以这样做:

User::find($userid)->shows()->detach([3,8]); // Removes 3 and 8

在每个示例之后,User 将仅与 Shows 4 和 5 有关系。

【讨论】:

  • 现在的问题是我得到了重复的组合(比如 4,5 2 次),是不是因为我需要将两者组合的唯一约束添加到表中?
  • 如果您使用的是sync,则不应创建重复项。当您说(4,5) 出现两次时,您的意思是有两行user_id=4show_id=5Shows 4 和5 与两个不同的Users 相关?
  • 另外,attach 不检查重复项。如果你需要确保没有任何重复,你应该使用sync
  • 不,我的意思是用户 4 可以与多个节目(5、6、7...)相关,但每个节目只能关联一次。
  • 是的,因此您可以在表上创建一个唯一约束以在数据库中强制执行该约束,但如果您使用的是sync,那么您不需要这样做。我想这取决于你。
【解决方案2】:

如果不工作同步或同步保存两个记录。

此代码有效

$product->attributes()->sync([
        1 => ['product_id' => $product], 
        1 => ['provider_id' => $provider]
    ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多