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

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

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

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

Q&A

解決済

1回答

14732閲覧

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

kkkkkaaaaaaa

総合スコア0

Laravel

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

0グッド

0クリップ

投稿2020/07/24 02:18

前提・実現したいこと

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

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

該当のソースコード

####ProductsController.php(Controller)

php

1 2 //view 3 public function edit($id) 4 { 5 //出品情報 6 $products = Products::find($id); 7 //カテゴリー一覧取得 8 $categories = Categories::all(); 9 //該当カテゴリーid取得 10 $c_id = $products->categories_id; 11 //該当カテゴリー名取得 12 $c_name = $categories->where('id', $c_id); 13 //更新日時変更 14 $updated_at = now(); 15 //id 16 $id = $products->id; 17 return view('member.trade_edit', compact('products', 'categories', 'c_name','updated_at','id')); 18 } 19 20 21 public function update($id,ProductsEditRequest $request) 22 { 23 //不正遷移を防止 24 if (!ctype_digit($id)) { 25 return redirect('index')->with('flash_message', __('Invalid operation was performed.')); 26 } 27 28 //情報取得 29 $products = Products::find($id); 30 //修正実装 31 $products->fill($request->all())->save(); 32 return redirect('member/trade/list')->with('flash_message', __('Edited.')); 33 }

####Products.php(Model)

php

1namespace App\Models; 2 3use Illuminate\Database\Eloquent\Model; 4 5class Products extends Model 6{ 7 protected $table = 'products'; 8 protected $primaryKey = 'products.id'; 9 protected $fillable = [ 10 'product_name','product_describe','categories_id','trade_flag','product_image1', 11 'product_image2','product_image3','product_image4','product_image5','users_id', 12 'updated_at', 13 ]; 14 15 public function categories(){ 16 return $this->belongsTo('App\Models\Product','categories_id'); 17 } 18}

####User.php(Model)

php

1namespace App\Models; 2 3use App\Notifications\PasswordResetNotification; 4use Illuminate\Contracts\Auth\MustVerifyEmail; 5use Illuminate\Foundation\Auth\User as Authenticatable; 6use Illuminate\Notifications\Notifiable; 7use Illuminate\Database\Eloquent\SoftDeletes; 8 9class User extends Authenticatable 10{ 11 use Notifiable; 12 use SoftDeletes; 13 14 //softdelete用 15 protected $table = 'users'; 16 protected $dates = ['deleted_at']; 17 18 protected $fillable = [ 19 'name', 'email', 'password','zip','tel' 20 ]; 21 22 protected $hidden = [ 23 'password', 'remember_token', 24 ]; 25 26 protected $casts = [ 27 'email_verified_at' => 'datetime', 28 ]; 29 30 public function products(){ 31 return $this->hasMany('App\Models\Product'); 32 } 33 34 public function sendPasswordResetNotification($token) 35 { 36 $this->notify(new PasswordResetNotification($token)); 37 } 38}

####Categories.php(Model)

php

1namespace App\Models; 2use Illuminate\Database\Eloquent\Model; 3 4class Categories extends Model 5{ 6 protected $table = 'categories'; 7 protected $fillable = [ 8 'category_name', 9 ]; 10 public $primaryKey = 'categories.id'; 11 12 public function products(){ 13 return $this->hasMany('App\Models\Categories')->orderBy('id','DESC'); 14 } 15}

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

php

1<form action="{{ route('tradeUpdate',$products->id) }}" method="POST" class="register_form"> 2 @csrf 3 <label for="product_name" class="register_label">出品タイトル(50文字以内):</label> 4 <input type="text" id="product_name" name="product_name" class="register_input @error('product_name') is-invalid @enderror" placeholder="出品タイトル" required value="{{ $products->product_name }}"> 5 @error('product_name') 6 <span class="errorMsg" role="alert"> 7 <strong>{{ $message }}</strong> 8 </span> 9 @enderror 10 11 <label for="categories_id" class="register_label">カテゴリー:</label> 12 <div class="select_color"> 13 <select name="categories_id" id="categories_id" class="register_select @error('category_id') is-invalid @enderror" required > 14 @if($c_name !== '') 15 @foreach($c_name as $member=>$index) 16 <option value="{{$index->id}}">{{ $index->category_name.' [登録上のカテゴリー]' }} </option> 17 @endforeach 18 @endif 19 <option value="0" hidden>▼選択してください</option> 20 @foreach($categories as $category) 21 <option value="{{$category->id}}">{{$category->category_name}}</option> 22 @endforeach 23 </select> 24 </div> 25 @error('categories_id') 26 <span class="errorMsg" role="alert"> 27 <strong>{{ $message }}</strong> 28 </span> 29 @enderror 30 31 <label for="product_describe" class="register_label">概要(500文字以内):</label> 32 <textarea name="product_describe" id="product_describe" class="register_textarea @error('product_describe') is-invalid @enderror" required placeholder="概要(500文字以内)">{{ $products->product_describe }}</textarea> 33 @error('product_describe') 34 <span class="errorMsg" role="alert"> 35 <strong>{{ $message }}</strong> 36 </span> 37 @enderror 38 39 <label class="register_label">画像:</label> 40 <a href="{{ route('editImage',$products->id) }}"><span class="submit_reUploads">画像を変更する</span></a> 41 42 <input type="text" name="updated_at" hidden value="{{ $updated_at }}"> 43 <input type="text" name="id" hidden value="{{ $id }}"> 44 <div class="btn_space_edit"> 45 <input type="submit" class="edit_submit" value="{{ __('Edit.') }}"> 46 <a href="{{ route('tradeRemove',$products->id) }}"><span>{{ __('Deleted.') }}</span></a> 47 </div> 48 </form>

####web.php(route)

php

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

####ProductsEditRequest.php(FormRequest)

php

1namespace App\Http\Requests; 2 3use Illuminate\Foundation\Http\FormRequest; 4 5class ProductsEditRequest extends FormRequest 6{ 7 public function authorize() 8 { 9 return true; 10 } 11 12 public function rules() 13 { 14 return [ 15 'product_name'=> 'required | string | max:255', 16 'product_describe' => 'required | string | max:500', 17 'categories_id' => 'required | Integer | max:22', 18 ]; 19 } 20}

試したこと

  • キャッシュクリア(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に戻していますが問題解消されず)なので問題があるとしたらモデルやテーブルなのかなあと思っています。

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

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

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

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

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

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

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

回答1

0

自己解決

meshi_s様の回答を元にクローズさせていただきたく思います。

原因は$primaryKeyを設定したためにエラーが起こりました。
productsテーブルの主キーはidにも関わらず、products.idとオーバーロードさせたのが原因だと思われます。
よってコメントアウトもしくは削除することによって解決しました。

app/Models/Products.php

1class Products extends Model 2{ 3 protected $table = 'products'; 4 5 //$primaryKeyを削除 6 //protected $primaryKey = 'products.id'; 7 8    //以下略 9}

参考: https://readouble.com/laravel/7.x/ja/eloquent.html

Eloquentはさらにテーブルの主キーがidというカラム名であると想定しています。

ドキュメントをよくみていなかったのが原因でした。注意します。
問題解決にご協力いただきありがとうございました。

投稿2020/07/29 20:08

kkkkkaaaaaaa

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問