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

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

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

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

解決済

Laravel save()で更新ができない

kkkkkaaaaaaa
kkkkkaaaaaaa

総合スコア0

Laravel

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

1回答

0評価

0クリップ

8040閲覧

投稿2020/07/24 02:18

前提・実現したいこと

初投稿&初心者です。
オークションサイトを作成しています。
登録済の出品データ編集画面をLaravelで実装したいのですが更新ボタンを押すと遷移はするが更新されません。
dd($request->all())すると値はきちんと取得できている。
dd($products)も値はきちんと取得できている。

エラーメッセージが出ないので原因が分からず詰み状態です。
どうすればsave()が正常に動くのでしょうか。

該当のソースコード

####ProductsController.php(Controller)

php

//view public function edit($id) { //出品情報 $products = Products::find($id); //カテゴリー一覧取得 $categories = Categories::all(); //該当カテゴリーid取得 $c_id = $products->categories_id; //該当カテゴリー名取得 $c_name = $categories->where('id', $c_id); //更新日時変更 $updated_at = now(); //id $id = $products->id; return view('member.trade_edit', compact('products', 'categories', 'c_name','updated_at','id')); } public function update($id,ProductsEditRequest $request) { //不正遷移を防止 if (!ctype_digit($id)) { return redirect('index')->with('flash_message', __('Invalid operation was performed.')); } //情報取得 $products = Products::find($id); //修正実装 $products->fill($request->all())->save(); return redirect('member/trade/list')->with('flash_message', __('Edited.')); }

####Products.php(Model)

php

namespace App\Models; use Illuminate\Database\Eloquent\Model; class Products extends Model { protected $table = 'products'; protected $primaryKey = 'products.id'; protected $fillable = [ 'product_name','product_describe','categories_id','trade_flag','product_image1', 'product_image2','product_image3','product_image4','product_image5','users_id', 'updated_at', ]; public function categories(){ return $this->belongsTo('App\Models\Product','categories_id'); } }

####User.php(Model)

php

namespace App\Models; use App\Notifications\PasswordResetNotification; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\SoftDeletes; class User extends Authenticatable { use Notifiable; use SoftDeletes; //softdelete用 protected $table = 'users'; protected $dates = ['deleted_at']; protected $fillable = [ 'name', 'email', 'password','zip','tel' ]; protected $hidden = [ 'password', 'remember_token', ]; protected $casts = [ 'email_verified_at' => 'datetime', ]; public function products(){ return $this->hasMany('App\Models\Product'); } public function sendPasswordResetNotification($token) { $this->notify(new PasswordResetNotification($token)); } }

####Categories.php(Model)

php

namespace App\Models; use Illuminate\Database\Eloquent\Model; class Categories extends Model { protected $table = 'categories'; protected $fillable = [ 'category_name', ]; public $primaryKey = 'categories.id'; public function products(){ return $this->hasMany('App\Models\Categories')->orderBy('id','DESC'); } }

####trade_edit.blade.php(view)

php

<form action="{{ route('tradeUpdate',$products->id) }}" method="POST" class="register_form"> @csrf <label for="product_name" class="register_label">出品タイトル(50文字以内):</label> <input type="text" id="product_name" name="product_name" class="register_input @error('product_name') is-invalid @enderror" placeholder="出品タイトル" required value="{{ $products->product_name }}"> @error('product_name') <span class="errorMsg" role="alert"> <strong>{{ $message }}</strong> </span> @enderror <label for="categories_id" class="register_label">カテゴリー:</label> <div class="select_color"> <select name="categories_id" id="categories_id" class="register_select @error('category_id') is-invalid @enderror" required > @if($c_name !== '') @foreach($c_name as $member=>$index) <option value="{{$index->id}}">{{ $index->category_name.' [登録上のカテゴリー]' }} </option> @endforeach @endif <option value="0" hidden>▼選択してください</option> @foreach($categories as $category) <option value="{{$category->id}}">{{$category->category_name}}</option> @endforeach </select> </div> @error('categories_id') <span class="errorMsg" role="alert"> <strong>{{ $message }}</strong> </span> @enderror <label for="product_describe" class="register_label">概要(500文字以内):</label> <textarea name="product_describe" id="product_describe" class="register_textarea @error('product_describe') is-invalid @enderror" required placeholder="概要(500文字以内)">{{ $products->product_describe }}</textarea> @error('product_describe') <span class="errorMsg" role="alert"> <strong>{{ $message }}</strong> </span> @enderror <label class="register_label">画像:</label> <a href="{{ route('editImage',$products->id) }}"><span class="submit_reUploads">画像を変更する</span></a> <input type="text" name="updated_at" hidden value="{{ $updated_at }}"> <input type="text" name="id" hidden value="{{ $id }}"> <div class="btn_space_edit"> <input type="submit" class="edit_submit" value="{{ __('Edit.') }}"> <a href="{{ route('tradeRemove',$products->id) }}"><span>{{ __('Deleted.') }}</span></a> </div> </form>

####web.php(route)

php

Route::group(['middleware' => 'auth'],function(){ Route::get('member/trade/{id}/edit','Member\ProductsController@edit')->name('tradeEdit'); Route::post('member/trade/{id}/update','Member\ProductsController@update')->name('tradeUpdate'); });

####ProductsEditRequest.php(FormRequest)

php

namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ProductsEditRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'product_name'=> 'required | string | max:255', 'product_describe' => 'required | string | max:500', 'categories_id' => 'required | Integer | max:22', ]; } }

試したこと

  • キャッシュクリア(php artisan cache:clear etc)
  • テーブル作り直し(php artisan migrate:reset)
  • bootstrap/cache/config.php の削除
  • controller見直し
  • ルーティングの見直し
  • view見直し
  • 他のテーブルでは編集できないのかと思い試してみたら編集できた

以上効果なし、エラーメッセージも表示されない

補足情報(FW/ツールのバージョンなど)

Laravel Framework 7.21.0
Composer version 1.10.9
php 7.2.31(cli)
MAMP利用

参考

https://saba.omnioo.com/note/2507/laravel5%E3%81%A7save%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C/

画像は別ページで更新します
PhpStomで書いています
出品情報はproductsテーブル、カテゴリーはcategoriesテーブル、ユーザー情報はusersで管理しています。
何かヒントをいただけませんでしょうか。数日悩んで進まずお手上げです。

ちなみに最初からこの状態ではなく数日前までは問題なくsave()が動いていました。2日前くらいにproductsテーブルのtrade_flagのカラム属性をbooleanからstringに変更したりカラムを追加してからsave()ができなくなりました。(現在はtrade_flagはbooleanに戻していますが問題解消されず)なので問題があるとしたらモデルやテーブルなのかなあと思っています。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

meshi_s

2020/07/27 08:20

答えは持ち合わせていないのですが… save()を入れない「$products->fill($request->all())」で値がセットされているか確認してみるとか、「$products->fill($request->all())->toSql()」(かな?)でsql文を出力して確認してみるのはいかがでしょうか。
kkkkkaaaaaaa

2020/07/27 20:36

meshi_s様 ご指摘ありがとうございます。 1. dd($products->fill($request->all()))の結果 #attributes: array:14 [▼ "id" => 1 "product_name" => "aaaaaaa" "product_describe" => "aaaaaaaa" "categories_id" => "2" "users_id" => 1 "product_image1" => "kruxuHqP04qeDA9tK0CpC4YiBervJiIBVS5pohZS.jpeg" "trade_flag" => 0 "product_image2" => "no_image.jpg" "product_image3" => "no_image.jpg" "product_image4" => "no_image.jpg" "product_image5" => "no_image.jpg" "deleted_at" => null "created_at" => "2020-07-28 04:02:46" "updated_at" => "2020-07-28 05:30:16" ] #original: array:14 [▼ "id" => 1 "product_name" => "aaaaaaa" "product_describe" => "aaaaaaaa" "categories_id" => "2" "users_id" => 1 "product_image1" => "kruxuHqP04qeDA9tK0CpC4YiBervJiIBVS5pohZS.jpeg" "trade_flag" => 0 "product_image2" => "no_image.jpg" "product_image3" => "no_image.jpg" "product_image4" => "no_image.jpg" "product_image5" => "no_image.jpg" "deleted_at" => null "created_at" => "2020-07-28 04:02:46" "updated_at" => "2020-07-28 05:30:16" ] #changes: array:3 [▼ "product_name" => "aaaaaaa" "product_describe" => "aaaaaaaa" "updated_at" => "2020-07-28 05:30:16" ] 2. dd($products->fill($request->all())->toSql())の結果 "select * from `products`" となりました。2の結果を見ると$requestがうまく値を持ってきていないように見えますが、1の結果を見ると値は渡っているように見えます。引き続き色々試してみます。最悪ModelやControllerを作り直した方がいいのかもしれませんが…
meshi_s

2020/07/28 06:10

「$products->fill($request->all())->toSql()」は意味なさそうでしたね。すみません。 関係ないかもしれませんが、modelのtableやprimaryKeyを外して確認してみるとか、fillでなく、直接セットしてsaveしてみるとか試すのもありかもしれません。
kkkkkaaaaaaa

2020/07/28 10:41

meshi_s様 ご指摘ありがとうございます。 >modelのtableやprimaryKeyを外して確認してみる ModelのProducts..phpからprimaryKeyを外したところsave()が機能しました。 自分一人ではprimaryKeyが原因とは気づきませんでした。 アドバイスありがとうございました!
phper.k

2020/07/29 00:27

routes/web.php の該当部分の記述を提示してください
kkkkkaaaaaaa

2020/07/29 08:19

phper.k様 お世話になります。 以下該当部分です。スマホからのコピペのため表示がずれるかもしれません。 Route::group(['middleware' => 'auth'],function(){ Route::get('member/trade/{id}/edit','Member\ProductsController@edit')->name('tradeEdit'); Route::post('member/trade/{id}/update','Member\ProductsController@update')->name('tradeUpdate'); }); 以上よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/07/29 13:58

すでに問題が解決しているのであれば、解決方法を自分で回答し、解決済みとしてみてはどうでしょうか

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel

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