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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

1回答

322閲覧

cakephp DBへの複数画像保存

m.kk

総合スコア23

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

0クリップ

投稿2020/10/26 14:03

アイテムと同時に複数の画像を登録できるようにsaveManyをつかっているのですが、
結果はfalseではないのにDBに保存されません。
画像は専用のDBに挿入しようとしています。

model <?php namespace App\Model\Table;use Cake\ORM\TableRegistry;use App\Model\Table\AppTable; use Cake\ORM\Table;use Cake\ORM\Entity; use App\Model\Behavior\Validation; class ImagesTable extends AppTable { public function initialize(array $config ) { $this->belongsTo('Items'); } public function saveImagesData( $data, $item_id) { $res = $data['image_path']; if ( $res !== null ) $images = []; foreach( $res as $key => $val) { $val['item_id'] = $item_id; $val['image_path'] = $val['file_path']; unset($val['file_path']); $images[] = $val; } $getImages = TableRegistry::getTableLocator()->get('Images'); $images = $getImages->newEntity($images); return $getImage->saveMany( $images ); }
controller public function complete() { if ( $this->request->is( [ 'put', 'post' ] ) ) { if ( isset( $this->request->data['complete'] ) ) { $data = $this->_session->read( 'item_edit' ); $item_id = $this->Items->saveData( $data ); $this->Images->saveImagesData( $data, $item_id ); // 登録したセッションを削除する $this->_session->delete( 'item_edit' ); return $this->redirect( '/items/complete' ); } else if ( isset( $this->request->data['back'] ) ) { return $this->redirect( '/items/application' ) ; } } }
component public function saveFile( &$data, $key, $file_path='file_path' ) { if ( count( $data ) !== 0 ) { // cakeのrequestデータ if ( isset( $data[$key]['tmp_name'] ) ) { $data[$key][$file_path] = self::save( $data, $key ); } else { foreach( $data[$key] as $k => $v ) { $data[$key][$k][$file_path] = self::save( $v, $key, $data, $k ); } } } } // ファイルの移動 public function save( $val, $key, $data=null, $k=null ) { $image = ( isset( $val[$key]['tmp_name'] ) ) ? $val[$key] : $val; // 配列じゃない場合は、スルー if ( is_array( $image ) === false ) return $val; if ( $image['error'] === 0 && $image['size'] !== 0 ) { if ( is_uploaded_file( $image['tmp_name'] ) === true ) { $mime_type = mime_content_type( $image['tmp_name'] ); //$dir = 'img' . DS . 'upload' . DS; switch( $mime_type ) { case 'image/gif': $dir = 'img'; $ext = '.gif'; break; case 'image/jpeg': $dir = 'img'; $ext = '.jpg'; break; case 'image/png': $dir = 'img'; $ext = '.png'; break; case 'application/pdf': $dir = 'pdf'; $ext = '.pdf'; break; default: $dir = 'img'; } if( $key !== null ) $dir .= DS . $key; $file_name = time() . '_' . uniqid( rand() ) . $ext; $dir .= $this->getTargetDir( $file_name ); if ( is_dir( WWW_ROOT . 'upload' . DS . $dir ) === false ) mkdir( WWW_ROOT . 'upload' . DS . $dir, 0777, true ); move_uploaded_file( $image['tmp_name'], WWW_ROOT . DS . 'upload' . DS . $dir . DS . $file_name ); $file_name = 'upload' . DS . $dir . DS . $file_name; return $file_name; } } else if ( $image['size'] === 0 && $k !== null && isset( $data['hidden_' . $key][$k] ) ) { return $data['hidden_' . $key][$k]; } else if ( $image['size'] === 0 && isset( $val['hidden_' . $key] ) ) { return $val['hidden_' . $key]; } }

どなたか原因わかるかたいらっしゃいますでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

ImagesTable::saveImagesDataメソッド内で、newEntitiesではなく、newEntityを使用しています。
複数のエンティティデータ作成する目的なので newEntities が正しいです。

投稿2020/10/28 08:12

nojimage

総合スコア957

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

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

m.kk

2020/10/29 13:14

返事が遅れてしまい大変申し訳ありません! 上記のアドバイスで複数投稿が可能になりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問