質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

2058閲覧

LaravelをAPIとして使用。routeがうまく通っていないような気がします

mikeko0901

総合スコア227

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/07/17 08:02

Laravelを勉強しています。(Laravel8系使用)
表側はVueコンポーネントでページを作り、LaravelはAPIとして使用しています。
アカウントの検索機能を実装したいのですが、そこでRouteがうまく通っていないのかよくわからないエラーが出て困っております。
アドバイスいただけますと幸いです。

イメージ説明
このように、Emailか名前をセットして、検索をクリックすると検索結果のデータを取得できるというところで、
検索ボタンをクリックしたところの処理がうまくいっていません…

###各コードとエラー

■検索ボタン部分 AccountSearch.vue

<template> <div class="mb-2"> <form method="post" onsubmit="return false;"> <div class="form-group row mt-4"> <div class="col-md-3"> <label class="col-form-label text-sm">▼Email{{ search_email }}</label> <div class=""> <input type="text" class="form-control text-sm form-control-sm" maxlength="30" v-model="search_email"> </div> </div> <div class="col-md-3"> <label class="col-form-label text-sm">▼名前{{ search_name }}</label> <div class=""> <select class="form-control text-sm form-control-sm" v-model="search_name"> <option class="text-sm" value="">-----</option> <option v-for="(name, index) in names" v-bind:value="name.value" :key="index"> {{ name.label }} </option> </select> </div> </div> </div> <button class="btn btn-outline-info btn-flat" @click="search" >検索</button> </form> </div> </template> <script> export default{ props: { }, data() { return { search_email: "", search_name: "", names: [ {label: "管理者", value: "管理者"}, {label: "一般", value: "一般"}, ] } }, mounted() { }, methods: { search: function() { const url = '/api/accounts/search'; alert(url); let params = new FormData(); params.append('search_email', this.search_email ?? ''); params.append('search_name', this.search_name ?? ''); axios.post(url, params, { headers: { 'Content-Type': 'application/x-www-form-urlencode', }, }) .then(response => { }); }, }, } </script>

※検索ボタンをクリックすると、searchメソッドが発動する。

■Route api.php

<?php use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; use App\Http\Controllers\AccountController; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); Route::get('/accounts', [AccountController::class, 'index']); Route::post('/accounts', [AccountController::class, 'store']); Route::get('/accounts/{id}', [AccountController::class, 'show']); Route::post('/accounts/{id}', [AccountController::class, 'update']); Route::post('/accounts/destroy', [AccountController::class, 'destroy']); Route::post('/accounts/search', [AccountController::class, 'search']);

■コントローラー AccountController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Admin; use Illuminate\Support\Facades\Hash; class AccountController extends Controller { public function index() { return Admin::all(); } public function store(Request $request) { //return Account::create($request->all()); テキストはこれだけ //同じメールアドレスがあるかチェック $same_account = Admin::where('email', $request->email)->first(); if($same_account) { return("既に同じメールアドレスが登録されています。"); } $account = new Admin(); $saved_account = $account->create([ 'name' => '一般', 'email' => $request->email, 'password' => Hash::make($request->password1), ]); return(1); } public function show($id) { $account = Admin::where('id', $id)->first(); return($account); } public function update(Request $request, $id) { $account = Admin::where('id', $id)->first(); //パスワードのセット if($request->password1 == null) { $save_password = $account->password; } else { $save_password = Hash::make($request->password1); } $account->update([ 'email' => $request->email, 'password' => $save_password, ]); return(1); } public function destroy(Request $request) { $account_id = $request->account_id; dd($account_id); } public function search(Request $request) { dd($request); $search_email = $request->search_email; $search_name = $request->search_name; $query = Admin::query(); if(!empty($search_email)) { $query->where('email', 'like', '%'.$search_email.'%'); } if(!empty($search_name)) { $query->where('name', $search_name); } $accounts = $query->paginate(15); } }

※検索ボタンをクリックすると、function:searchに行くようにしているつもりです。
検証のため、$requestをdd();しています。

■出ているエラー

Trying to get property 'password' of non-object", exception: "ErrorException"

イメージ説明

function:searchではすぐにddしており、passwordなど使用していないのですが、、
なんとなく、function:updateにルートが通っているような気がします…
どうすれば正しいルートに通せるか・・・行き詰まっておりお知恵をお貸しいただけますと幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Route::post('/accounts/{id}', [AccountController::class, 'update']); Route::post('/accounts/destroy', [AccountController::class, 'destroy']); Route::post('/accounts/search', [AccountController::class, 'search']);

上から最短マッチで処理されるので

Route::post('/accounts/{id}', [AccountController::class, 'update']);

のid部分にsearchが入ってこっちが実行されてます
updateを最後に持ってくるといいでしょう。(destroyも同じ問題が出ます)

投稿2021/07/17 08:06

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikeko0901

2021/07/17 08:15

ありがとうございます… destroyも同じでした。。 vue経由だとrouteのnameで指定できないので、urlを違うものにした方がよいのでしょうか。。 Route::post('/accounts/{id}', [AccountController::class, 'update']); Route::post('/account_destroy', [AccountController::class, 'destroy']); Route::post('/accounts_search', [AccountController::class, 'search']); のように。
mikkame

2021/07/17 08:23

PUT DELETEで分けるのが多いですね
mikeko0901

2021/07/17 08:30

ありがとうございます!試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問