

cakephp3を最近使い始めたものです。  
予定表を作成したり編集できるようなものを作ろうとしていて、addアクションの中で「2015年4月1日~30日までの予定を、2015年4月分として30個の入力欄が並んだ画面から一気に登録する」という動きを作ろうとしています。

フォームの部分は規約の通り書き、addアクションに渡された値は

[code]

    'Schedules' => [
        (int) 0 => [
            'day' => '2015-04-01',
            'event' => 'あああ',
            'start' => '11',
            'end' => '12'
        ],
        (int) 1 => [
            'day' => '2015-04-02',
            'event' => 'aaaa',
            'start' => '22',
            'end' => '23'
        ],……
    
[/code]

という形になっているのですが、それを以下のように

[code]

    public function add(){
            $schedulestable = TableRegistry::get('Schedules');
        if ($this->request->is('post')) {
            $schedules = $schedulestable->newEntities($this->request->data());
            foreach($schedules as $schedule){
                $schedulestable->save($schedule);
            }
        }
        $this->set('schedules', $schedules);
    }
    
[/code]

エンティティに変換してsaveしようとしても上手くいかず、なにも保存されません。  
ちなみに

[code]

    public function add(){
            $schedulestable = TableRegistry::get('Schedules');
            $schedules = $schedulestable->newEntity();
        if ($this->request->is('post')) {
            $schedules = $schedulestable->patchEntities($schedules, $this->request->data());
            foreach($schedules as $schedule){
                $schedulestable->save($schedule);
            }
        }
        $this->set('schedules', $schedules);
    }
    
[/code]

というように先に作成してから書き込んでいく方法も試してみましたが、やはり上手くいきませんでした。どちらの場合もループを回す直前の$schedulesの値が、

[code]

    [
    (int) 0 => object(App\Model\Entity\Schedule) {
    
        'new' => true,
        'accessible' => [
            '*' => true
        ],
        'properties' => [
            (int) 0 => [
                'day' => '2015-04-01',
                'event' => 'あああ',
                'start' => '11',
                'end' => '12'
            ],
            (int) 1 => [
                'day' => '2015-04-02',
                'event' => 'aaaa',
                'start' => '22',
                'end' => '23'
            ],……
    
[/code]

という風に要素を一つしかもたない配列になっていて、直後のループがこの一つ上の階層で回ってしまって一回しか実行されないようになってしまっているのが原因なのではないかと思っている（実際foreachのなかで*debug($schedule)*するとそのような結果になる）のですが、どうすれば上手くいくのかわかりません。もちろんforeachで回すのを$schedules[0]にしてみてもダメでした。  
ちなみにaddアクションにpostした際にはエラーもワーニングも表示されず、データも保存されないので何も起こらない状態になっています。

どのような書き方をすればこの問題を解決できるのでしょうか？それとももしくは、私が考えているのと違うところに原因があるのでしょうか？どなたかご教示ください。


CC BY-SA 3.0
2015-03-15T15:52:35.793
7945
2015-03-16T02:19:59.233
8841
question
php cakephp
cakephp3で複数のレコードを同時に登録できない


CakePHP3ではnewEntitiesに渡す連想配列のキーが数値になっていないと複数エンティティ扱いにならないので

[code]

    $schedules = $schedulestable->newEntities($this->request->data('Schedules'));
    
[/code]

のように記述します。

内部ではnewEntities()に渡された値がそのまま、\Cake\ORM\Marshaller::many()に引き渡され

[code]

    public function many(array $data, array $options = [])
    {
        $output = [];
        foreach ($data as $record) {
            $output[] = $this->one($record, $options);
        }
        return $output;
    }
    
[/code]

のように処理されるので、リクエストデータのキーが`Schedules`のままではうまくいかない事がわかると思います。


CC BY-SA 3.0
2015-03-16T02:19:59.233
7950
2015-03-16T02:19:59.233
8844
7945
answer