我有一個使用 JS 和 Laravel 的專案。
在blade.php 中,我有一個帶有復選框的專案串列,我根據其狀態從外部資料庫中檢索該串列。我需要能夠選擇一些專案,然后一鍵更改其狀態(例如“存檔”)。
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');
在ticketController中,我有以下功能:
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
}
(它的第二個連接的外部資料庫,所以我不能為它制作模型,所以我手動白色查詢)
在 ticket.blade 我添加了腳本,所以我可以在 JS 中訪問路由變數
<script>
const ticketsApi = @json($route);
</script>
我的問題是 - 如何使用我在blade.php 中傳遞的路由將已檢查票證的 id 陣列發布到 Controller 中的“更新”函式?(我知道我也可以在 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 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);
})
}
網頁.php:
Route::put("/tickets/update", [TicketsController::class, 'update'])->name('tickets.update');
控制器:
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
]);
}
我仍然收到兩個錯誤: 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() 并且內置函式在路由 /bills/{id} 中提供了一個 id,但我想更新其中的一堆,而不是一個一個
uj5u.com熱心網友回復:
首先,您POST在 fetch 請求中使用該方法,而您的路由使用PUT動詞。因此,您必須將 fetch 中指定的方法更改為PUT.
以下是您的控制器的一些問題:
您的 id 陣列位于請求正文中,而不是作為 URL 的引數,因此您需要調整控制器操作以使用請求。
您想使用帶有 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;
]);
}
uj5u.com熱心網友回復:
謝謝大家。我找到了解決方案,讓它在沒有 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>
在控制器中:
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');
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361932.html
標籤:javascript php laravel
