首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel将id传递给我的sql on按钮,单击“从视图”。

Laravel将id传递给我的sql on按钮,单击“从视图”。
EN

Stack Overflow用户
提问于 2022-09-09 06:10:32
回答 8查看 272关注 0票数 0

我正在尝试使用activatedeactivate来获取一个使用$product->status的表单。

活动按钮显示如果$product->status为0,而非活动按钮显示$product->status为1。

每次单击此按钮时,我都希望切换mysql数据库中$product->status的值。

代码语言:javascript
运行
复制
 <form action="{{route('invetory.create')}}" method="POST">
  @csrf
  <table class="table table-bordered" id="dynamicTable">
    <tr>
      <th>item</th>
      <th>tax</th>
      <th>Action</th>
    </tr>
    @forelse($products as $product)
    <input type="text" name="item" value="{{$product->id}}
    class="form-control" hidden />
    <td>
      <input type="text" name="item" value="{{$product->item}}
      class="form-control" />
    </td>
    <td>
      <input type="text" name="tax" value="{{$product->tax}}
      class="form-control" />
    </td>

   @if($product->status =='0')
    <td>
      <button type="button" data-id="{{ $product->id }}" class="btn btn-success remove-tr active_btn">active</button>
    </td>
  @else
    <td>
      <button type="button" data-id="{{ $product->id }}" class="btn btn-danger remove-tr deactive_btn">Deactive</button>
    </td>
  @endif
  </table>
</form>

在这里,我给出了我使用web.php的路线

代码语言:javascript
运行
复制
Route::post('/update', 'App\Http\Controllers\InventoryController@update')>name('invetory.update');

这里我添加了我使用过InventoryController.php的控制器

代码语言:javascript
运行
复制
public function update(Request $REQUEST){
  dd($REQUEST->all());
  
       Inventory::update( $REQUEST->invetory as $key => $value);
 
    return redirect()->action([InventoryController::class, 'index']);
}

当我点击按钮时,我得到了500错误。

EN

回答 8

Stack Overflow用户

发布于 2022-09-09 06:44:07

您可以向按钮中添加一些数据属性,并在js中使用它们发送ajax请求。

代码语言:javascript
运行
复制
@if ($product->status =='0')
  <td>
    <button type="button" class="btn btn-success toggle-tr" data-product="{{ $product->id }}" data-status="{{ $product->status }}">active</button>
  </td>
@else
  <td>
    <button type="button" class="btn btn-danger toggle-tr" data-product="{{ $product->id }}" data-status="{{ $product->status }}">Deactive</button>
  </td>
@endif
代码语言:javascript
运行
复制
document.querySelectorAll('.toggle-tr').forEach(el => el.addEventListener('click', e => {
  const product = e.target.dataset.product;
  const status = e.target.dataset.status == 0 ? 1 : 0;
  // send ajax or fetch request passing in product_id. If we're going with a RESTful approach,
  axiox.patch(`/products/${product}`, { status })
    .then(res => { ... })
    .catch(err => { ...});  
}));
票数 0
EN

Stack Overflow用户

发布于 2022-09-13 13:16:16

您可以使用POST请求来实现这一点,这将在每次切换产品时刷新页面,或者可以使用AJAX异步进行更改。使用Javascript和AJAX将是首选的方式,这样您就不会丢失选定的过滤器、分页等。

您不需要外部包来实现这一点,您可以使用JavaScript的fetch方法。此外,与其有两个单独的功能和路由,我建议有一个路由将切换产品的状态,即,如果它是活动的,使它不活跃,反之亦然。根据定义,该方法应该是POST请求,为了避免CSRF保护和使用中间件来保护请求,我更愿意为此做GET请求。

这是完整的代码。

  1. 注册一个在web.php中切换状态的web路由
代码语言:javascript
运行
复制
Route::get('projects/toggle', [ProjectController::class, 'toggle'])->name('projects.toggle');
  1. toggle方法在ProjectController.php中的实现
代码语言:javascript
运行
复制
public function toggle(Request $request) {
    $project = Project::find($request->project_id);

    $project->status = !$project->status;

    $project->save();

    return response()->json(['status' => (int) $project->status]);
}

请注意,我正在返回一个json响应,其中包括新的项目状态。我们将在JavaScript代码中使用它来对显示状态的列进行显式更新。

  1. 最后,在刀片文件中,当迭代项目时,单击按钮调用将执行AJAX请求的函数。请注意,我还向包含状态的列添加了一个id属性,这样我就可以对其进行第纳尔访问,以便更新它。
代码语言:javascript
运行
复制
 @foreach($projects as $project)
    <tr>
        <td>{{$project->title}}</td>
        <td id="project-status-{{$project->id}}">{{$project->status}}</td>
        <td><button onClick="toggleStatus('{{$project->id}}')">Toggle</button></td>
    </tr>
@endforeach

在同一个文件中,我们添加了以下JavaScript代码。它接受project_id作为参数,通过单击按钮传递给ajax请求,使ajax请求后端更新状态,然后更新适当的DOM元素以显示新状态。

代码语言:javascript
运行
复制
function toggleStatus(project_id) {
    fetch("{{ route('projects.toggle') }}?project_id=" + project_id)
        .then(response => response.json())
        .then(response => {
            document.querySelector("#project-status-" + project_id).innerHTML = response.status;
     })
}

正如我提到的,您可以在JavaScript部件中使用多个选项。您可以向每个按钮注册一个事件侦听器,而不是调用一个函数,但是使用函数调用的这种方法要快一些。另外,我将project_id作为GET参数传递,您可以将包含它的路由定义为路由参数,但接下来您需要执行一些字符串替换,以便在JavaScript中执行字符串替换。总之,提出的方案是一个很好的解决方案,将服务于你的目的。

附注:对于这样的东西,LiveWire是一个完美的契合。

票数 0
EN

Stack Overflow用户

发布于 2022-09-16 09:44:40

使用dd (例如在控制器中)会抛出500个错误。它的字面意思是“倾倒和死亡”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73657988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档