report3215648
@report3215648 (ス ライ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

laravel formについて

こんにちは。
現在laravelを使用してアプリを作成しています。
bootstrapのmadal機能を使用していて、ポップアップ画面の中に「削除」「保存」ボタンを追加したいのですがFormタグを2つ用意すると一つのアクションしか実行されません。(保存のみ)

二つの「削除」「保存」メソッドを実行させるにはどのようにコードを編集すれば良いでしょうか?

該当するソースコード

    <form action="{{ route('major_update')}}" method='post'>
    @csrf
    <div class="modal fade" id="popup-edit" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div id="popup" class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">編集画面</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <form action="{{ route('major_delete')}}" method='post'>
                    @csrf
                    <div class="modal-body">
                        <div class="form-group">
                            <h6>ID</h6>
                            <input type="text" name="edit_id" id="edit_id"  value="">
                        </div>
                        <div class="form-group">
                            <span>項目名</span>
                            <input type="text" name="edit_name" value="" id="edit_name">
                        </div>
                    </div>
                    <div class="modal-footer">

                        <button id="delete" class="btn btn-danger">削除</button>
                    </form>
                    <button id="cancel" type="button" class="btn btn-warning" data-dismiss="modal">閉じる</button>
                    <button  id="register" class="btn btn-success">保存</button>
                </div>
            </div>
        </div>
    </div>
  </form>
</body>

code内の矢印のある所が問題のFormアクションです。

0

2Answer

Comments

  1. @report3215648

    Questioner

    @kamotetuさん

    ご回答ありがとうございます。

    入れ子と言うのですね。

    お陰様で助かりました。

質問者さんのしたいことはいわゆる「upsert」というものでしょうか?
通常、1アクションで複数の動作を行う場合、バックエンド(ControllerまたはModel)側でその処理を保証します。(vueなど非同期で実行することでフロントで2つ実行することもできますが、bladeの場合、処理は同期処理なので厳しいです)
upsertであれば、laravelではEloquentの「updateOrCreate」が有効かなと。
下記に簡単に説明があるので参考になると思います。
https://awesome-linus.com/2019/07/03/laravel-upsert/
フロントはボタンひとつ置いてformのaction先にmethodを生やしてあげればできます。

そうではなく、deleteとsaveどちらも別で実装したい、というのであれば、一手間必要です。
具体的には「getDirty()」でアクションを起こす前のDBデータを参照する方法です。
delete前のデータをgetDirty()で持ちつつsave()をかける、という方法です。
https://minory.org/laravel-isdirty-getdirty.html

後者は履歴チェック・更新やトランザクション処理で使いますが、結果はどちらも同じになるので前者の方が可読性も高いのでおすすめです。

0Like

Your answer might help someone💌