目次
はじめに
こちらは数本の記事で構成されています
- ①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でデータを1件のみ取得し、画面に表示させる
実装
①フロントエンドから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" label="タスク名" dense outlined color="primary" readonly></v-text-field>
</li>
<li class="mb-3">
<v-textarea :value="task.task_detail" label="詳細" dense outlined color="primary" readonly></v-textarea>
</li>
</ul>
</section>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn @click="$router.push(`/main/task/update?taskId=${task.task_id}`)" class="orange white--text">
<span>編集</span>
<v-icon>mdi-pencil</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)",
},
};
},
methods: {
+ getTask() {
+ const requestConfig = {
+ url: "http://localhost:8001/api/task",
+ method: "GET",
+ params: {
+ id: this.$route.query.taskId,
+ },
+ };
+ 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::post('/task', 'App\Http\Controllers\TaskController@postTask');
+ Route::get('/task', 'App\Http\Controllers\TaskController@getTask');
これで「②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;
+ }
}
これで「③コントローラーからデータベースにリクエストを送る」が達成されました
④通信に成功した場合のみ一覧画面に遷移する
<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" label="タスク名" dense outlined color="primary" readonly></v-text-field>
</li>
<li class="mb-3">
<v-textarea :value="task.task_detail" label="詳細" dense outlined color="primary" readonly></v-textarea>
</li>
</ul>
</section>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn @click="$router.push(`/main/task/update?taskId=${task.task_id}`)" class="orange white--text">
<span>編集</span>
<v-icon>mdi-pencil</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: "",
},
};
},
methods: {
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("エラー");
});
},
},
mounted() {
this.getTask();
},
};
</script>
これで「④レスポンスを画面に表示させる」が達成されました
確認
http://localhost:3000/#/main/task/read?taskId=5 にアクセスし下記の画面が表示されれば成功