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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

2回答

1204閲覧

laravel 中間テーブルの値が削除出来ない

chiicheer

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/09/10 10:22

前提・実現したいこと

companyのadminページに、そのcompanyに所属しているuserの一覧リストを表示させています。
個々のuser情報に削除ボタンを作成し、その特定のuserのみを削除出来るようにしたい。

発生している問題・エラーメッセージ

特にエラーはでない。 削除ボタンを押した時に、通常であれば画面が切り替わってエラーになるが画面も切り替わらない。

該当のソースコード

《companiesのadmin.blade.php》 @extends('layouts.app') <?php $role=Auth::user()->role; $users=Auth::user(); ?> @if($role == $company->id) @section('content') <div class="container"> <br> <h2>御社に応募している登録者情報</h2> @foreach($company->users as $user) <br> <table class="table table-striped"> <tr> <th class="table-dark" width="20%">{{ __('氏名') }}</th> <td>{{ $user->name }}</td> </tr> .......省略 <br> <br> {!!Form::open(['action'=>['Company_UserController@destroy', $company->id], 'method'=>'POST'])!!} {{ Form::hidden('_method', 'DELETE') }} {{ Form::submit('消去', ['class'=>'btn']) }} {!! Form::close() !!} @endforeach <br> </table> @else <h3>申し訳ございません。<br> こちらのページはご覧頂けません。</h3> @endif <a class="btn" href="/countries">戻る</a> </div> @endsection
《CompaniesController.php》 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth;//←これが重要! use Illuminate\Support\Facades\Storage; use Illuminate\Database\Eloquent\Collection; use App\Company; use App\User; use App\Country; class CompaniesController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ /*public function __construct() { $this->middleware('auth', ['except'=>['show']]); }*/    ・・・省略 /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { $company=Company::find($id); if(Auth::user()->role == $company->id || Auth::user()->id == 1){ Storage::delete('public/photos1'. $company->cover_image1); Storage::delete('public/photos2'. $company->cover_image2); Storage::delete('public/photos3'. $company->cover_image3); } $company->users()->detach(); $company->delete(); return redirect('/countries/' . $company->country_id)->with('success', '御社の内容が正常に削除されました。 正しく反映されているか確認をして下さい。'); } }
《Company_UserController.php》 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Database\Eloquent\Collection; use App\Company; use App\User; class Company_UserController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $company=Company::findOrFail($request->input('company_id')); $user=User::findOrFail(Auth::id()); $company->users()->attach($user->id); return redirect('/companies/' . $company->id)->with('success', '応募が完了しました。 担当者からの連絡をお待ち下さい。'); } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { $company=Company::find($id); $company->users()->detach($user->id); return redirect('/companies/{{$company-id}}/admin')->with('success', '削除が完了しました。正しく反映されているか確認して下さい。'); } }
《Company.php》 <?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; use App\User; class Company extends Model { protected $fillable= array('country_id', 'cover_image1', 'cover_image2', 'cover_image3', 'title', 'description', 'job_content', 'place', 'relate', 'role', 'salary', 'welfare', 'time', 'skill', 'apply_way', 'company_name', 'company_place', 'employee', 'company_type', 'company_content'); public function country(){ return $this->belongsTo('App\Country'); } public function users() { return $this->belongsToMany('App\User', 'company__users')->withTimestamps(); } }
《User.php》 <?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'name_call', 'email', 'password', 'role', 'gender', 'tel', 'birthday', 'university_name', 'university_degree', 'university_date', 'master_university', 'master_degree', 'master_date', 'company_name', 'position', 'period', 'company_name2', 'position2', 'period2', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function companies(){ return $this->belongsToMany('App\Company', 'company__users')->withTimestamps(); } }
《web.php》 <?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::resource("countries", "CountriesController"); Route::resource("companies", "CompaniesController"); Route::resource("users", "UsersController"); Route::resource("company__users", "Company_UserController"); Route::get("/companies/{id}/admin", "CompaniesController@admin"); Route::get("/users/{id}/edit", "UsersController@edit"); Route::post('/companies/{id}/admin', 'Company_UserController@destroy'); Route::post('/countries/store', 'CountriesController@store'); Route::post('/companies/store', 'CompaniesController@store'); //Route::post("/companies/{id}", "CompaniesController@store"); //Route::get("/companies/{id}", "CompaniesController@show"); Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');

試したこと

{!!Form::open(['route' => 'company__users.destroy', 'method'=>'POST'])!!}
と書くと、エラーになる。

C:\Users\Chihiro Suzuki\Desktop\africa\africaworks-test\vendor\laravel\framework\src\Illuminate\Routing\Exceptions\UrlGenerationException.php <?php namespace Illuminate\Routing\Exceptions; use Exception; class UrlGenerationException extends Exception { /** * Create a new exception for missing route parameters. * * @param \Illuminate\Routing\Route $route * @return static */ public static function forMissingParameters($route) { return new static("Missing required parameters for [Route: {$route->getName()}] [URI: {$route->uri()}]."); } } Arguments "Missing required parameters for [Route: company__users.destroy] [URI: company__users/{company__user}]. (View: C:\Users\Chihiro Suzuki\Desktop\africa\africaworks-test\resources\views\companies\admin.blade.php) ◀" 

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/10 10:42

今出先なので詳細な回答はできないんですが、とりあえずreturn redirect('/companies/{{$company-id}}/admin')の書き方はNGということをstoreから学んで欲しかったですね。
chiicheer

2018/09/10 10:47

失礼致しました。コード書き換えました。return redirect('/companies/' . $company->id . '/admin')->with('success', '削除が完了しました。正しく反映されているか確認して下さい。');
退会済みユーザー

退会済みユーザー

2018/09/10 10:52

それでokです。あと本題のところはリクエストメソッドがPOSTになってますけどDELETEですね。
chiicheer

2018/09/10 11:54

{!!Form::open(['action'=>['Company_UserController@destroy', $company->id], 'method'=>'DELETE'])!!}に変更しました。まだ削除ボタンを押しても他のページの削除ボタンのようにページ飛びません。
guest

回答2

0

回答依頼されてしまったので来ました。

まずルーティングを整理して下さい。

web.php

Route::post('/countries/store', 'CountriesController@store'); Route::post('/companies/store', 'CompaniesController@store'); //Route::post("/companies/{id}", "CompaniesController@store"); //Route::get("/companies/{id}", "CompaniesController@show");

Route::post('/countries/store', 'CountriesController@store');Route::post('/companies/store', 'CompaniesController@store'); は上で定義している resource と被っておりバグの原因になるので消します。
使わなくなった行のコメントアウトも汚いコードの典型なので残しておかず消して下さい。

admin.blade.php

{!!Form::open(['action'=>['Company_UserController@destroy', $company->id], 'method'=>'POST'])!!} {{ Form::hidden('_method', 'DELETE') }}

ここは合っている気もしますが、

{{ Form::open([ 'route' => ['company__users.destroy', $company->id] ]) }}

と書き換えてみて下さい。
Web.phpルート定義に従って自動でDELETEメソッドになる+ {{ Form::hidden('_method', 'DELETE') }} の記述も勝手に補完してくれるはず。

Company_UserController
クラス名がキャメルケースとスネークケースがごっちゃのキメラになっていてかなり直した方がいい感じですが、そこは気にせずいきます。

$company=Company::find($id); $company->users()->detach($user->id); return redirect('/companies/{{$company-id}}/admin')->with('success', '削除が完了しました。正しく反映されているか確認して下さい。');

$company->users()->detach($user->id);$user 変数どこから来たんや・・・
当然ながら定義していない変数は使えません。

$user = Auth::user(); $company=Company::find($id); $company->users()->detach($user->id);

多分やりたかったのはこんな感じだと思います。

あと、前回も指摘しましたが '/companies/{{$company-id}}/admin'{{$company-id}} はいい感じに解釈されることはないです。
シングルクオートで囲んだ時点でただの文字列でしかありません。
print('1 + 1') と書いて 2 って出力されたらびっくりしますよね?

正しいパラメータの渡し方は ドキュメント を見て下さい。

投稿2018/09/10 12:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chiicheer

2018/09/10 13:05

ありがとうございます!! コード書き換えましたが、やはり削除ボタンが押せません。
退会済みユーザー

退会済みユーザー

2018/09/10 14:18

根拠はないですが直らない気がしていました。 うーん、今回もGithub貼ってもらった方が早いかなという感じですね。 趣味で回答してるだけなので、確約はできませんが、暇な時に見ます。
guest

0

routeで指定した時に、Missing required parameters for と出ていたのは、
エラー内容そのままですが、パラメータが見つからない、ということなのでしょうね。

{!!Form::open(['action'=>['Company_UserController@destroy', $company->id], 'method'=>'POST'])!!}

ここの$companyは$userではないのが原因とかではないですか?

そことは別に、遷移しないということを踏まえると、
吐き出されたHTML側に不備が出たからなのかなと思います。
実際アウトプットされたHTMLを見ると何か分かるかもしれませんね。

  • ボタンが実はsubmitではない

この時は、JSなどでclickトリガーが動かないと何も起きないので、遷移はしません。

  • formタグのaction属性が空

一瞬遷移しますが、自身に飛ぶので遷移しないと感じるかもしれません。

「遷移しない」というHTMLサイドの不備で絞るとこの2つくらいなのではと思います。

この原因になる箇所を見ると、Formファサードのどこかに問題があるのでしょうね。

Formファサードを使ったことはないですが、少なくとも、ざっとマニュアルを見るにsubmitはあっているように思います。

となると、action属性として吐き出されるべき送信先の問題なのだと思うのですが、
Form::openでは、actionの代わりにurlも指定できるようなので、一度urlで指定してみたらどうでしょう。

解決されているといいのですが。

投稿2018/12/15 05:07

ChigusaYasoda

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問