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

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

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

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

Q&A

解決済

2回答

6345閲覧

チェックボックス(複数選択可)をデータベースに登録

ssk

総合スコア332

CakePHP

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

0グッド

1クリップ

投稿2016/11/20 07:37

バージョン

CakePHP3

やりたい事

・チェックボックス(複数選択可)をデータベースに登録
・◯◯;◯◯;◯◯と1つのカラムに登録

できている事

データベースのカラム(◯◯;◯◯;◯◯)と照合して既に値がある場合はcheckedにする。
ところまで、完成しています。その他のファイルはいじっていません。

PHP

1✓edit.ctp 2 3echo $this->Form->input('hoge29',[ 4 'type' => 'select', 5 'options' => $checkbox, 6 'value' => explode(';', $hoges->hoge29), 7 'checked' => true, 8 'multiple' => 'checkbox', 9 'label' => false, 10 ]);

わからない事

・edit.ctpで選択されたチェックボックス(配列)の受け取り方
・その値を◯◯;◯◯;◯◯という形式で1つのカラムに追加・更新する方法

以上です。
宜しくお願い致しますm(_ _)m

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

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

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

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

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

guest

回答2

0

コメント等のやり取りを見て、思うところですが、

このような要件の場合、データベースは正規化すべきと思われます。
あえて非正規化している理由は何かあるのでしょうか?


#現状の設計で起こる問題

一つ前の質問を参照し、現状で起こりうる問題の具体例を示します。

例えば、以下のようなデータになっている場合、「コーヒー」を含むレコードをどうやって取り出しますか?

IDCHECKBOXES
1コーヒー,紅茶,ココア
2コーヒー牛乳,紅茶
3コーヒーゼリー

投稿2016/11/20 09:53

編集2016/11/20 11:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ssk

2016/11/20 10:24

Kosuke_Shibuya様 コメントありがとうございますm(_ _)m 現状、データの構成上、1つのカラムで◯◯;◯◯;◯◯と表示しなければいけない状態です。
退会済みユーザー

退会済みユーザー

2016/11/20 10:26 編集

正規化した上で、表示はGROUP_CONCAT 使えば済むことなので、自分だったら正規化しますね。 ソースコードが複雑になりだけだし、検索方法も限定されてしまうので。
ssk

2016/11/20 10:31

正規化とは、◯◯;◯◯;◯◯を1つのカラムで表示 ではなく、1つ1つカラムを分けるということでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/20 10:47

違いますよ。 具体的な例で説明した方がわかりやすいかと思うのですが、今回使用しているテーブル名と、チェックボックスの値に利用している名前はなんですか? また、チェックボックスには具体的にどのような項目がありますか?
ssk

2016/11/20 11:05

Kosuke_Shibuya様 以下、現在開発環境で行っている情報でございます。 情報は足りますでしょうか? テーブル名:drinks チェックボックスの値:■コーヒー ■紅茶 ■ココア ✓具体的なHTML <input type="checkbox" name="drink[]" value="コーヒー"> <input type="checkbox" name="drink[]" value="紅茶"> <input type="checkbox" name="drink[]" value="ココア">
退会済みユーザー

退会済みユーザー

2016/11/20 11:07

これはどういった意味合いになるのでしょうかね。 例えば、「店舗」と「取扱商品」といった感じですか?
ssk

2016/11/20 11:09

Kosuke_Shibuya様 具体的なテーブルまでご提示いただき、ありがとうございますm(_ _)m コーヒー◯◯というケースがある場合は難しいですね、、 どのように正規化するのがベストでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/20 11:11

それがどういうシステムなのか、概略をお伝え願います。
ssk

2016/11/20 11:13

CakePHPの勉強中でデータベースの設計まで回っていませんでしたm(_ _)m クライアント管理に利用しようと考えています。
退会済みユーザー

退会済みユーザー

2016/11/20 11:15

あまりぼんやりとした回答だと、サンプル作れないし、sskさんの技量わからないので、 ・クライアントとは何?(店?個人?) ・クライアントと「ドリンク」ってどういう意味合いで関連しているのか をお伝え下さい。
ssk

2016/11/20 11:27 編集

クライアントは個人の方です。 ドリンクというのはあくまでサンプルでして これから自分に合わせてプログラミングをしていきます。 今回では、クライアントに定休日を紐付ける場合 チェックボックスで行おうとしていましたm(_ _)m その実装をするために、開発環境で わかりやすくドリンクで進めていた次第です。
退会済みユーザー

退会済みユーザー

2016/11/20 11:31

解決済になっていますが、正規化のサンプルの提示は不要? それとも新しく質問を立てる感じですか?
ssk

2016/11/20 11:37

質問した内容は解決しましたので、解決済とさせていただきましたm(_ _)m 後程、必ず躓くと思うので 正規化も是非、教えていただければ幸いです。 解決済にしたため、誤解を招いてしまい申し訳ございません。
退会済みユーザー

退会済みユーザー

2016/11/20 11:45 編集

この手の類似質問は定期的に見受けられるので、お手数ではありますが、ぜひ新しく質問を立ててください。sskさんのみならず、検索でやって来た同様の初学者のためにもなりますので。 例示としては、「取引先」と「定休日」で良いかと思います。
guest

0

ベストアンサー

saveする前に、配列をimplode関数で文字列に変換すればいいと思います。patchEntityより前に文字列にしないと不正な値と判断されて捨てられてしまいます。Controllerでやるなら、patchEntity前までに変換するといいかと。Tableクラスでやるなら、beforeMarshalでやる感じでしょうか。

投稿2016/11/20 08:36

編集2016/11/20 09:33
popobot

総合スコア6586

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

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

ssk

2016/11/20 09:13 編集

HogesController.phpの以下でデータベースに登録していると思うのですが どのように受け取って、データベースに追加できますか? public function edit($id = null) { $hoges = $this->Hoges->get($id, [ 'contain' => [] ]); if ($this->request->is(['patch', 'post', 'put'])) { $hoges = $this->Hoges->patchEntity($hoge, $this->request->data); if ($this->Hoges->save($hoge)) { $this->Flash->success(__('The hoge has been saved.')); return $this->redirect(['action' => 'index']); } else { $this->Flash->error(__('The hoge could not be saved. Please, try again.')); } } $this->set(compact('hoge')); $this->set('_serialize', ['hoge']); } icchii様、度々ありがとうございますm(_ _)m
popobot

2016/11/20 09:20

postデータは$this->request->dataに格納されています。debug($this->request->data);等で出力して見て確認してください。データベースへの更新は、$this->Hoges->save($hoge)で実行されます。 なので、その間で文字列化したらいいと思いますけど
popobot

2016/11/20 09:29 編集

よくよく考えると...patchEntityしたときに、文字列ではなく配列のままだと、不正な値と判断されて、捨てられてしまうので、patchEntity前に文字列化しないとだめですね...。
ssk

2016/11/20 09:40

ありがとうございます。 以下の形で$hoge29に◯◯;◯◯;の文字列を入れるところまでできました。 この$hoge29をデータベースに反映するには、どのように書いたらよいでしょうか? if ($this->request->is(['patch', 'post', 'put'])) { $hoge29 = $this->request->data('hoge29'); $hoge29 = implode(';',$hoge29); $hoges = $this->Hoges->patchEntity($hoge, $this->request->data); if ($this->Hoges->save($hoge)) { $this->Flash->success(__('The hoge has been saved.')); return $this->redirect(['action' => 'index']);
ssk

2016/11/20 10:34 編集

icchii様 以下のコードで意図した結果を得られました。 正常に動作はしているので、合っているとは思うのですが 「こう書いた方が良い」などございましたら、教えて頂けると後学のために助かりますm(_ _)m if ($this->request->is(['patch', 'post', 'put'])) { $hoge29 = $this->request->data('hoge29'); $hoge29 = implode(';',$hoge29); $this->request->data['hoge29'] = $hoge29; $hoges = $this->Hoges->patchEntity($hoge, $this->request->data); if ($this->Hoges->save($hoge)) { $this->Flash->success(__('The hoge has been saved.')); return $this->redirect(['action' => 'index']);
popobot

2016/11/20 10:48

それで大丈夫だと思いますよ。 Tableクラス側に書くこともできますが、やや複雑になるので、あまりおすすめしません。
ssk

2016/11/20 11:00

かしこまりましたm(_ _)m ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問