2015-06-20 103 views
1

我有一张表格,其中只有其他两个表格的ID,我想要一个n:m的关系,但现在每次我保存一条记录时,如果其中一个ID已被使用。Laravel 5数据透视表只保存第一条记录

我的迁移:

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'); 
} 

SHOWS

​​

这就是我如何保存到数据透视表:

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

当我这样做对用户1(我),展出5,这样可以节省1和5,当我再次尝试相同的用户上显示12,这样可以节省1和12,并删除1和5从前的记录。如果我通过phpMyAdmin手动插入,我可以添加多个记录,但不使用同步。我也尝试过这一点,达到相同的结果:

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

尝试'attach()'而不是'sync()'。 – user2094178

回答

2

您没有正确使用sync()sync()用于添加并从User删除Shows,并且期望一组Showids。因此,如果您拨打sync([1,5]),您将Showsids的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的关系。

+0

现在的问题是我得到的重复组合(如4,5 2次),是否因为我需要添加一个表的组合的唯一约束? –

+0

如果你使用'sync',它不应该创建重复。当你说'(4,5)'在那里两次时,你的意思是有两行'user_id = 4'和'show_id = 5',或者'Shows' 4和5与两个不同的用户有关? – BrokenBinary

+0

另外,'attach'不检查重复项。如果你需要确保没有任何重复,你应该使用'sync'。 – BrokenBinary