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

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

ただいまの
回答率

87.36%

Laravel foreachで配列を一行ずつデータベースに登録したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,899

score 13

前提・実現したいこと

Vue.jsでaxios.postされたオブジェクトを配列に変換し、
データベースに一行ずつ登録したいです。

<template>
 <form>
   <div>
         <div v-for="n in 10">
             <label class="label">データ{{n}}</label>
             <input class="input" type="text" v-model="form.data[n - 1]">
         </div>
     <button type="button" @click="submit">登録する</button>
     </div>
</form>
</template>
<script>
    export default {
        data() {
            return {
                form:{
                    data: [],
                },
            }
        },
        methods:{
            submit(){
                var dataform = new FormData();
                dataform.append('data', this.form.data);

                var url = '/project/add'
                axios.post(url, dataform)
                    .then(function(response){
                    })
                    .catch(function(error){
                    });
            }
        }
    }
</script>
public function new(Request $request){
        $datasets = (array)$request->data;

        foreach ($datasets as $index => $data) {
            $data.'_'.$index = new Data;
            $data.'_'.$index->label = $data;
            $data.'_'.$index->save();
            }
        }

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

受け取った配列がデータベースに一つのデータとしてそのまま登録されてしまいます。

mysql> select * from data;
+----+----------------------+---------------------+---------------------+
| id | label                | created_at          | updated_at          |
+----+----------------------+---------------------+---------------------+
|  1 | A,B,C          | 2019-10-25 10:40:02 | 2019-10-25 10:40:02 |
+----+----------------------+---------------------+---------------------+


本当はこうしたいです

mysql> select * from data;
+----+----------------------+---------------------+---------------------+
| id | label                | created_at          | updated_at          |
+----+----------------------+---------------------+---------------------+
|  1 | A             | 2019-10-25 10:40:02 | 2019-10-25 10:40:02 |
|  2 | B             | 2019-10-25 10:40:02 | 2019-10-25 10:40:02 |
|  3 | C             | 2019-10-25 10:40:02 | 2019-10-25 10:40:02 |
+----+----------------------+---------------------+---------------------+

試したこと

配列をforeachで配列をひとつずつ取り出して、
indexキーで異なる変数名を作っているはずなのですが、うまくいきません。

どなたか解決のヒントをいただけないでしょうか?
何卒よろしくお願いいたします。

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

Laravel Framework 6.3.0
vue@2.6.10 

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

PHPに対する間違った認識が2つあります。

indexキーで異なる変数名を作っているはず

foreach毎にnewするのだから、変数名は同じでも問題ない。
異なる変数名をつける必要はない。

$arr = ['a', 'b', 'c'];

foreach ($arr as $value) {
    $data = new Data();
    $data->label = $value;
    $data->save();
}

可変変数にアクセスしたい場合は下記の通りにする

$idx = 1;
$key = 'hoge'
$val_name = $key.'_'.$idx;
$$val_name // <= hoge_1にアクセスできる。$が2つ必要。

Laravel/Vueの前にPHPの基礎が必要かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/25 21:46 編集

    丁寧に教えていただき、ありがとうございます…!
    可変変数について、大変勉強になります。不勉強な質問をしてしまい申し訳ありません。

    異なる変数名をつけずに実行したのですが、同じ結果になってしまいます。。
    一度に複数行のデータを登録すること自体できないのでしょうか?
    何度も恐れ入りますが、ご教示いただけますと幸いです。

    public function new(Request $request){
    $datasets = (array)$request->data;
    foreach ($datasets as $data) {
    $new_data = new Position();
    $new_data->label = $data;
    $new_data->save();
    }
    }

    キャンセル

  • 2019/10/26 00:19

    requestのdataをarrayにキャストする必要はないのと
    この時点でrequestのdataをダンプしてみてください

    キャンセル

  • 2019/10/26 18:34

    mikkameさん、無事解決しました!!
    Vue側を修正し、requestをダンプした結果、arrayでpostされていることが分かり、
    以下でそのままforeachで一行ずつDBに登録することができました。
    何度も丁寧に教えていただき、本当にありがとうございました!!

    //Laravel
    $datasets = $request->params['data'];
    foreach ($datasets as $val) {
    $data = new Data();
    $data->label = $val;
    $data->save();
    }

    // Vue.js
    methods:{
    submit(){
    var url = '/project/add'
    axios.post(url, {
    params: {
    'data' : this.data,
    }
    })
    }

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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