[英]Passing JS variable(array) to Laravel Controller
我有一个使用 JS 和 Laravel 的项目。
在 Blade.php 中,我有一个带有复选框的项目列表,我根据其状态从外部数据库中检索到该列表。 我需要能够 select 一些项目并通过单击更改其状态(例如“存档”)。
function getSelected(){
let selected = new Array()
let tblTickets = document.getElementById('tblTickets')
let checked = tblTickets.getElementsByTagName("input")
for (let i = 0; i < checked.length; i++) {
if (checked[i].checked) {
selected.push(checked[i].value)
}
}
if (selected.length > 0) {
let nr = selected.map(Number)
console.log(nr)
}
}
这是我的 JS 代码,它为我提供了数字数组(id(s)-所选项目的主键)
在 web.php 我创建了命名路由进行更新:
Route::put("/tickets/update", [TicketsController::class, 'update'])->name('tickets.update');
在门票控制器中,我有以下 function:
public function update($ids){
foreach ($ids as $id) {
$tickets = DB::connection('secondDB')->table('ticket')
->join('ticket_status', 'id', '=', 'status_id')
->where('id', '=', $id)
->update(['name' => 'Closed']);
}
$route= route('tickets.update');
return view('tickets', [
'tickets' => $tickets,
'route' => $route
}
(它第二个连接的外部数据库,所以我不能为它制作Model,所以我手动白查询)
在 ticket.blade 我添加了脚本,所以我可以访问 JS 中的路由变量
<script>
const ticketsApi = @json($route);
</script>
我的问题是-如何使用我在blade.php中传递的路线将一组已检查票证的ID发布到Controller中的“更新”function? (我知道我也可以在 JS 中循环,但如果我有 1000 张票,我需要 POST 1000 个请求,我发现在 PHP 中循环更有效)。
这个不行
fetch(route,
{
method: "POST",
body: JSON.stringify(numbers)
})
.then(res => res.json())
.catch(error => {
console.error('Error:', error);
})
.then(data => {
console.log(JSON.stringify(data));
});
谢谢你的任何提示。
更新:
js function:
function getSelected(){
let payload = new Array()
let tblTickets = document.getElementById('tblTickets')
let checked = tblTickets.getElementsByTagName("input")
for (let i = 0; i < checked.length; i++) {
if (checked[i].checked) {
payload.push(checked[i].value)
}
}
let numbers = []
if (payload.length > 0) {
numbers = payload.map(Number)
console.log(numbers)
}
const putMethod = {
method : 'PUT',
headers: {
'Content-type': 'application/json; charset=UTF-8'
},
body: JSON.stringify(numbers)
}
fetch(urlUpdate, putMethod)
.then(res => res.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
})
}
web.php:
Route::put("/tickets/update", [TicketsController::class, 'update'])->name('tickets.update');
Controller:
public function update(Request $request): \Illuminate\Http\JsonResponse
{
$request->validate([
'ids' => ['required', 'array', 'min:1'],
'ids.*' => ['integer']
]);
$tickets = DB::connection('secondDb')->table('ticket')
->join('ticket_status', 'id', '=', 'status_id')
->whereIn('id', $request->input('ids'))
->update(['name' => 'Closed ']);
return response()->json([
'ticketsUpdated' => $tickets
]);
}
I still recieve two errors: action.js:57 PUT http://mypath/tickets/update 419 (unknown status) action.js:63 Error: SyntaxError: Unexpected token < in JSON at position 0
我真的无法弄清楚如何传递我的数组,将其拆分为数字作为 id 并更新数据库。 我有一个内部数据库的内置更新路线。 但是对于外部我不能使用 safe() 并在 function 中构建在路由 /bills/{id} 中提供了一个 id,但我想更新一堆,而不是一个一个
首先,您在获取请求中使用POST
方法,而您的路由使用PUT
动词。 因此,您必须将 fetch 中指定的方法更改为PUT
。
以下是您的 controller 的一些问题:
您的 id 数组在您的请求正文中,而不是作为 URL 的参数,因此您需要调整您的 controller 操作以使用请求。
您想使用带有 id 列表的路由来避免对数据库进行 1000 次查询,但您正在这样做,因为您使用的是 foreach 并且它没有优化。 您可以改用whereIn()
。
知道您正在使用 fetch,因此更愿意返回 JSON 响应而不是视图。
这是一个代码示例:
public function update(Request $request)
{
$request->validate([
'ids' => ['required', 'array', 'min:1'],
'ids.*' => ['integer']
]);
$tickets = DB::connection('secondDB')->table('ticket')
->join('ticket_status', 'id', '=', 'status_id')
->whereIn('id', $request->input('ids'))
->update(['name' => 'Closed']);
return response()->json([
'ticketsUpdated' => $tickets;
]);
}
谢谢大家。 我找到了使它在没有 JS 的情况下仅工作的解决方案 Laravel
在刀片中:
<form action="/tickets/update" method="POST">
@csrf
@method('PUT')
@foreach($tickets as $ticket)
<tr>
<td>
<input class="check" type="checkbox" id="{{$ticket->ticket_id}}" value="{{$ticket->ticket_id}}" name="ids[]" >
</td>
在 controller 中:
public function update(Request $request)
{
$numbers = $request->input('ids');
foreach ($numbers as $number)
{
$tickets = DB::connection('osdtbs')->table('ticket')
->where('ticket_id', '=', $number)
->update(['status_id' => '7']);
}
return redirect('/tickets');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.