目次
はじめに
こちらは数本の記事で構成されています
- ①Vue.js & Laravel8 & Docker(環境構築)
- ②Vue.js & Laravel8 & Docker(データベースとダミーデータの作成)
- ③Vue.js & Laravel8 & Docker(Read…データベースからデータを取得)
- ④Vue.js & Laravel8 & Docker(Create…データベースに保存)
- ⑤Vue.js & Laravel8 & Docker(Read…データベースからデータを1件のみ取得)
- ⑥Vue.js & Laravel8 & Docker(Update…データベースを更新)
- ⑦Vue.js & Laravel8 & Docker(Delete…データを削除)
目標
APIでデータベースのデータを更新する
実装
①フロントエンドからAPIにリクエストする
<template>
<v-card>
<v-card-title>編集({{task.task_name}} ID:{{task.task_id}})</v-card-title>
<v-card-text class="px-4">
<v-card-subtitle>タスク情報</v-card-subtitle>
<section>
<ul>
<li class="mb-3">
<v-text-field :value="task.task_name" @input="onUpdateName" label="タスク名" dense outlined color="primary"></v-text-field>
</li>
<li class="mb-3">
<v-textarea :value="task.task_detail" @input="onUpdateDetail" label="詳細" dense outlined color="primary"></v-textarea>
</li>
</ul>
</section>
</v-card-text>
<v-card-actions>
<v-btn color="error">
<span>削除</span>
<v-icon>mdi-delete</v-icon>
</v-btn>
<v-spacer></v-spacer>
- <v-btn color="primary">
+ <v-btn @click="updateTask()" color="primary">
<span>登録</span>
<v-icon>mdi-send</v-icon>
</v-btn>
</v-card-actions>
</v-card>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
task: {
task_id: 1,
task_name: "1番目のタスク(dummy)",
task_detail:
"1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)",
},
newTaskName: "",
};
},
methods: {
onUpdateName(taskName) {
this.task.task_name = taskName;
},
onUpdateDetail(taskDetail) {
this.task.task_detail = taskDetail;
},
getTask() {
const requestConfig = {
url: "http://localhost:8001/api/task",
method: "GET",
params: {
id: this.$route.query.taskId,
},
};
axios(requestConfig)
.then((res) => {
this.task = res.data;
})
.catch(() => {
alert("エラー");
});
},
+ updateTask() {
+ const requestConfig = {
+ url: "http://localhost:8001/api/task",
+ method: "PUT",
+ data: {
+ id: this.task.task_id,
+ name: this.task.task_name,
+ detail: this.task.task_detail,
+ },
+ };
+ axios(requestConfig)
+ .catch(() => {
+ alert("エラー");
+ });
+ },
},
mounted() {
this.getTask();
},
};
</script>
これで「①フロントエンドからAPIにリクエストする」が達成されました
②APIからコントローラーにリクエストを送る
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('/tasks', 'App\Http\Controllers\TaskController@getTasks');
Route::get('/task', 'App\Http\Controllers\TaskController@getTask');
Route::post('/task', 'App\Http\Controllers\TaskController@postTask');
+ Route::put('/task', 'App\Http\Controllers\TaskController@putTask');
これで「②APIからコントローラーにリクエストを送る」が達成されました
③コントローラーからデータベースにリクエストを送る
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Task;
class TaskController extends Controller
{
public function getTasks()
{
$data = Task::get();
return $data;
}
public function postTask(Request $request)
{
return Task::create([
'task_name' => $request['name'],
'task_detail' => $request['detail'],
]);
}
public function getTask(Request $request)
{
$task = Task::where('task_id', $request['id'])->first();
if (!$task) return response()->json(['errorMessage' => 'このデータは存在しません'], 404);
return $task;
}
+ public function putTask(Request $request)
+ {
+ return Task::where('task_id', $request['id'])->update([
+ 'task_name' => $request['name'],
+ 'task_detail' => $request['detail'],
+ ]);
+ }
}
これで「③コントローラーからデータベースにリクエストを送る」が達成されました
④通信に成功した場合のみ一覧画面に遷移する
<template>
<v-card>
<v-card-title>編集({{task.task_name}} ID:{{task.task_id}})</v-card-title>
<v-card-text class="px-4">
<v-card-subtitle>タスク情報</v-card-subtitle>
<section>
<ul>
<li class="mb-3">
<v-text-field :value="task.task_name" @input="onUpdateName" label="タスク名" dense outlined color="primary"></v-text-field>
</li>
<li class="mb-3">
<v-textarea :value="task.task_detail" @input="onUpdateDetail" label="詳細" dense outlined color="primary"></v-textarea>
</li>
</ul>
</section>
</v-card-text>
<v-card-actions>
<v-btn color="error">
<span>削除</span>
<v-icon>mdi-delete</v-icon>
</v-btn>
<v-spacer></v-spacer>
<v-btn @click="updateTask()" color="primary">
<span>登録</span>
<v-icon>mdi-send</v-icon>
</v-btn>
</v-card-actions>
</v-card>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
task: {
- task_id: 1,
- task_name: "1番目のタスク(dummy)",
- task_detail:
- "1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)1番目のタスクの詳細(dummy)",
+ task_id: 0,
+ task_name: "",
+ task_detail: "",
},
newTaskName: "",
};
},
methods: {
onUpdateName(taskName) {
this.task.task_name = taskName;
},
onUpdateDetail(taskDetail) {
this.task.task_detail = taskDetail;
},
getTask() {
const requestConfig = {
url: "http://localhost:8001/api/task",
method: "GET",
params: {
id: this.$route.query.taskId,
},
};
axios(requestConfig)
.then((res) => {
this.task = res.data;
})
.catch(() => {
alert("エラー");
});
},
updateTask() {
const requestConfig = {
url: "http://localhost:8001/api/task",
method: "PUT",
data: {
id: this.task.task_id,
name: this.task.task_name,
detail: this.task.task_detail,
},
};
axios(requestConfig)
+ .then(() => {
+ this.$router.push("/main/task");
+ })
.catch(() => {
alert("エラー");
});
},
},
mounted() {
this.getTask();
},
};
</script>
これで「④通信に成功した場合のみ一覧画面に遷移する」が達成されました
確認
http://localhost:3000/#/main/task/update?taskId=5 にアクセスしデータを更新できれば成功