如何使用 laravel 删除数据透视表中的单行

Posted

技术标签:

【中文标题】如何使用 laravel 删除数据透视表中的单行【英文标题】:How do delete single row in pivot table with laravel 【发布时间】:2020-09-15 13:39:03 【问题描述】:

我想删除数据透视表中的一行数据。我没有收到任何错误,但是当尝试单击按钮时。它没有将我重定向到任何地方,因此没有执行删除功能。

在上图中,我想删除 user_id = 3 的突出显示 id 我的情况是用户突然无法到达even_id = 6,因此用户想要删除/取消加入活动。

route

Route::get('/user/event/event', 'HomeController@destroy')->name('user.event.destroy');

blade

@foreach ($events as $event)
    <tr>
       <td>$loop->index +1 </td>
       <td>$event->event_name</td>
       <td>$event->event_date</td>
       <td>
        <form method="POST" action=" route('user.event.destroy',$event)">
          @csrf 
          @method('DELETE')
           <a class="btn btn-danger">Unjoined!</a> 
         </form>
         </td>
    </tr>
@endforeach

controller

public function storeEventUser(Request $request)
    
       $user = User::find(Auth::user()->id);
     //how I storing my pivot data (just to show if anyone asking)
      $user->events()->syncWithoutDetaching([$request->event_id]);
    


 public function destroy($event)
    
        $event= Event::findOrFail($event_id);
        $user->events()->detach($event);
        return redirect()->back()->with('success','Deleted.');
    

Event model

 public function users()
    
        return $this->belongsToMany(User::class,'event_user','event_id','user_id');
    

user model

public function events()
    
        return $this->belongsToMany(Event::class,'event_user','user_id','event_id');
    

【问题讨论】:

你试过你的代码了吗?你有什么特别需要澄清的吗? 你的 web.php 路由是 get 方法,不是 post 或 delete &lt;button type="submit" class="btn btn-danger"&gt;Unjoined!&lt;/button &gt; 您必须将其更改为 delete,因为这是您在表单中欺骗的方法 看起来你正在使用 @method('DELETE') 所以我会使用 Route::delete 【参考方案1】:

为了简单起见,我正在调整您的控制器方法以使用路由模型绑定:

public function destroy(Event $event)

    Auth::user()->events()->detach($event);
    // or from the other side of the relationship
    // $event->users()->detach(Auth::user());

    return redirect()->back()->with('success', 'Deleted.');

如 cmets 中所述,如果您想使用表单通过 @method('DELETE') Blade 指令进行欺骗的 DELETE HTTP 方法,则需要将路由调整到 Route::delete

旁注:

Auth::user() 返回一个User 实例,因此您无需在storeEventUser 方法中再次查询它:

$user = Auth::user();

【讨论】:

谢谢您,先生,今天我也从您和其他人那里学到了很多东西。我需要为此了解更多。谢谢你:) 有很多事情要做,慢慢来,尽量了解你正在做的事情的背景:)

以上是关于如何使用 laravel 删除数据透视表中的单行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用数据透视表中的 3 个关系创建关系?

laravel4 更新数据透视表中的附加列

如何删除透视表中的很多汇总行

如何在 Laravel 中使用附加或同步方法在数据透视表中插入多个值

多对多关系 - 如何更新数据透视表中的属性

如何删除熊猫数据透视表中的多级索引