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

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

ただいまの
回答率

89.99%

CakePHP3で複数レコードのINSERTを行いたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,154

yajin

score 73

CakepPHP3でフォームにループで組んだ情報を一度に書き込んでいきたいと思います。

現在、一つのレコードに関しては、実装済なのですが、いろいろと不具合が生じてきました。

  1. src\Model\Entity\Quiz.phpにてclass Bookmark extends Entity{}と定義してるのに1つのレコードの挿入はできる(valitationは働く。情報も挿入される)
  2. src\Model\Entity\Quiz.phpにてclass Quiz extends Entity{}と直すと、一つのレコードを挿入するctpファイルのコードの方ではnullのレコードが挿入されてしまう。(valitationは一応効くが、正しい情報を入力しても空レコードになる。)
  3. atomにてプロジェクト内を検索して、「ookmark」と検索するも、src\Model\Entity\Quiz.phpとsrc\Template\Pages\home.ctpに書いてあるBookmarkしか見当たらない。※これがとにかく気持ち悪い
  4. 複数レコードの際のフォームは、フォームヘルパーにてname属性を配列にしてあげるも、var_dumpすると、POSTは表示されるも、entitiesの方は入力された情報が見当たらない。

追記

  1. 別のプロジェクトにbakeコマンドで適当にモデルを作り、そのモデルにあった、以下の名前空間の階層化のコードをQuizsTable.phpに挿入して、bookmarkをquizに変更したら空フィールド現象はなくなりました。
    use App\Model\Entity\Quiz;
    use Cake\ORM\Query;
    use Cake\ORM\RulesChecker;
    use Cake\ORM\Table;
    use Cake\Validation\Validator;
  2. 複数データの挿入のみの問題になりました。 
  3. request->data()の引数に'Quizs'を追記したところ、
  • Warning (4096): Argument 1 passed to Cake\ORM\Table::newEntities() must be of the type array, null given, called in /var/www/html/cakephp/project_name/src/Controller/QuizsController.php on line 66 and defined [CORE/src/ORM/Table.php, line 2053]
  • Warning (4096): Argument 1 passed to Cake\ORM\Marshaller::many() must be of the type array, null given, called in /var/www/html/cakephp/project_name/vendor/cakephp/cakephp/src/ORM/Table.php on line 2059 and defined [CORE/src/ORM/Marshaller.php, line 286]
  • Warning (2): Invalid argument supplied for foreach() [CORE/src/ORM/Marshaller.php, line 289]

となりました。

追記
http://stackoverflow.com/questions/32912941/cakephp-3-x-saving-multiple-entities-newentities
のサイトより

  1.   echo $this->Form->input($i.'.question',['label' => '質問','placeholder' => '質問文']);
    と変えてみたら、valitation出ました。
    formヘルパーの文法的に
echo $this->Form->input('0.column_name', /* ... */);
echo $this->Form->input('1.column_name', /* ... */);


ですね。

addition5.ctp
<?php
                  echo $this->Form->create('Quizs',["class" => "quizform"]);
                for($i = 1; $i < 6;$i++){
                echo '<h2 class="add5">登録クイズ('.$i.'/5)</h2>';
                echo $this->Form->hidden('user_id',['value' => h($this->request->session()->read('Auth.User.id'))]);
                echo $this->Form->input('question['.$i.']',['label' => '質問','placeholder' => '質問文']);
                echo $this->Form->error('Model.question');
                echo $this->Form->input('answer['.$i.']',['label' => '答え','placeholder' => '答え']);
                echo $this->Form->error('Model.answer');
                }
                echo $this->Form->button('登録',["class" => "ok"]);
                echo $this->Form->end();
            ?>


コントローラの方は

public function addition5(){
    $this->ViewBuilder()->layout('hoge');
    $quizs = TableRegistry::get('Quizs');
    $entities = $quizs->newEntities($this->request->data('Quizs'));//Quizsと追記
    //var_dump($entities);

    if($this->request->is('post')){
      var_dump($entities);
    //  var_dump($_POST);こっちは情報が表示される。
    //   var_dump($entities);こっちは情報が表示されない。

    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

動けたということで内容を書かせていただきます。(まだ細かい部分は残っているとは思いますが・・・)

viewのほう

echo $this->Form->create($questions,["class" => "question_form"]);
                for($i = 0; $i < 5;$i++){
                echo $this->Form->hidden($i.'.user_id',['value' => h($this->request->session()->read('Auth.User.id'))]);

                echo $this->Form->input($i.'.question',['label' => '質問文','placeholder' => '質問文']);
               echo $this->Form->input($i.'.answer',['label' => 'answer','placeholder' => '答え']);

                }
                echo $this->Form->button('問題登録',["class" => "ok"]);
                echo $this->Form->end();


このように配列を0から0.columnとなるように記述する。1からやるとvalitationのエラーが1ずれる。

controllerのほう

public function addtion5(){
    $this->ViewBuilder()->layout('hoge');

    $questions = TableRegistry::get('Questions');
    $entities = $questions->newEntities($this->request->data());
    if($this->request->is('post')){
      foreach ($entities as $entity) {
            // Save entity
            $questions->save($entity);
        }
    }
     $this->set(compact('questions'));
     $this->set('_serialize', ['Questions']);
  }


ということでした!

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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