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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

11822閲覧

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

yajin

総合スコア75

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/07/28 09:00

編集2016/07/29 10:28

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の方は入力された情報が見当たらない。

追記
0. 別のプロジェクトに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;
0. 複数データの挿入のみの問題になりました。
0. 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
のサイトより
0. echo $this->Form->input($i.'.question',['label' => '質問','placeholder' => '質問文']);
と変えてみたら、valitation出ました。
formヘルパーの文法的に

php

1echo $this->Form->input('0.column_name', /* ... */); 2echo $this->Form->input('1.column_name', /* ... */); 3

ですね。

php

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

コントローラの方は

php

1 public function addition5(){ 2 $this->ViewBuilder()->layout('hoge'); 3 $quizs = TableRegistry::get('Quizs'); 4 $entities = $quizs->newEntities($this->request->data('Quizs'));//Quizsと追記 5 //var_dump($entities); 6 7 if($this->request->is('post')){ 8 var_dump($entities); 9 // var_dump($_POST);こっちは情報が表示される。 10 // var_dump($entities);こっちは情報が表示されない。 11 12 } 13 14 } 15

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

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

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

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

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

guest

回答1

0

自己解決

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

viewのほう

php

1 echo $this->Form->create($questions,["class" => "question_form"]); 2 for($i = 0; $i < 5;$i++){ 3 echo $this->Form->hidden($i.'.user_id',['value' => h($this->request->session()->read('Auth.User.id'))]); 4 5 echo $this->Form->input($i.'.question',['label' => '質問文','placeholder' => '質問文']); 6 echo $this->Form->input($i.'.answer',['label' => 'answer','placeholder' => '答え']); 7 8 } 9 echo $this->Form->button('問題登録',["class" => "ok"]); 10 echo $this->Form->end();

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

controllerのほう

php

1 public function addtion5(){ 2 $this->ViewBuilder()->layout('hoge'); 3 4 $questions = TableRegistry::get('Questions'); 5 $entities = $questions->newEntities($this->request->data()); 6 if($this->request->is('post')){ 7 foreach ($entities as $entity) { 8 // Save entity 9 $questions->save($entity); 10 } 11 } 12 $this->set(compact('questions')); 13 $this->set('_serialize', ['Questions']); 14 } 15

ということでした!

投稿2016/08/01 01:58

編集2016/08/01 04:57
yajin

総合スコア75

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問