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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

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

Q&A

解決済

2回答

2968閲覧

CakePHP3系のhasmanyの処理

kenkbou

総合スコア151

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2016/08/03 19:30

編集2016/08/05 16:06

Cake3系の事でつまづいた部分があり、ご相談させていただきました。

Cakephp3.2
PHP5.6
mysql5.6

やりたいことはシンプルで、
User情報に紐づくTagデータをチェックボックスで編集出来る画面を作りたいと思っています。

Templateには$userを渡して、

PHP

1template 2<?= $this->Form->create($user); ?> 3 4<?php foreach ($tags as $key => $val) : ?> 5 <?= $this->Form->input('tags.' . $key . '.name', [ 6 'label' => $val, 7 'class' => 'form-control', 8 'type' => 'checkbox', 9 'value' => $val 10 ] 11) ?> 12 13<?php endforeach; ?> 14<?= $this->Form->submi("send"); ?> 15<?= $this->Form->end(); ?>

このような感じで書いてみたのですが、うまくいきません。

var_dumpしたデータは以下のようになります。

PHP

1array (size=1) 2 'tags' => 3 array (size=24) 4 0 => 5 array (size=1) 6 'TagName' => string '0' (length=1) 7 1 => 8 array (size=1) 9 'TagName' => string '0' (length=1) 10 2 => 11 array (size=1) 12 'TagName' => string '0' (length=1) 13 3 => 14 array (size=1) 15 'TagName' => string '0' (length=1) 16 4 => 17 array (size=1) 18 'TagName' => string '0' (length=1) 19 5 => 20 array (size=1) 21 'TagName' => string '0' (length=1) 22 6 => 23 array (size=1) 24 'TagName' => string '0' (length=1) 25 7 => 26 array (size=1) 27 'TagName' => string '0' (length=1) 28 8 => 29 array (size=1) 30 'TagName' => string '0' (length=1) 31 9 => 32 array (size=1) 33 'TagName' => string 'TagName' (length=7) 34 10 => 35 array (size=1) 36 'TagName' => string '0' (length=1)

CakeのHelperの性質を活かして、『DBにデータが格納されている場合は、チェックが入れてある』みたいにしたいです。

よろしくお願い致します。

※追加
テーブル構成は以下のような感じです。
Usersテーブル
id int
username varchar
password varchar
created datetime
modified datetime

Tagsテーブル
id int
user_id int
tagName varchar
created datetime
modified datetime

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

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

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

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

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

KatsumiTanaka

2016/08/05 14:43

試してみたいので、データの取得元となっているスキーマを提示いただけますか?
kenkbou

2016/08/05 16:05

ありがとうございます。 テーブル構成は以下のようなシンプルな感じです。 よろしくお願い致します。 Usersテーブル id int username varchar password varchar created datetime modified datetime Tagsテーブル id int user_id int tagName varchar created datetime modified datetime
kenkbou

2016/08/05 16:06

すみません、見辛いかと思いまして、質問に加筆させていただきました。
guest

回答2

0

以下のような感じで、少しS.INOさんのやりたいことに近づけたかと、思います。

CakePHP

1<?php if (!empty($tagdata)): ?> 2 <?php foreach ($tagdata as $tagarray) : ?> 3 <?php foreach ($tagarray as $key => $val) :?> 4 <?= $this->Form->input('tags.' . $key . '.name', [ 5 'label' => $val['TagName'], 6 'class' => 'form-control', 7 'type' => 'checkbox', 8 'value' => $val['TagName'], 9 'checked' => $val['TagName']!="0"?true:false 10 ] 11 ) ?> 12 <?php endforeach; ?> 13 <?php endforeach; ?> 14<?php endif; ?>

いくつか、補足しておきます
0. 元データの問題
元データは、配列(例では$tagdata)の1番目の要素として配列'tags'があり、さらにその'tags'の中にデータが格納されている形式となっています。
ですので、$tagdataの最初の配列を取り出し、さらにそれからデータをforeachで取り出しています。
また、提示された例だとTagNameに0、またはTag名称が格納されていますが、これだとそのユーザに紐づかないTagの名称は表示されません。すなわち、チェックボックスに表示される名称はチェックされないものはすべて0となってしまいます。

  1. データ型の問題

これは、自分が試した環境がやっつけだったせいもありますが、Bakeした環境のままだと$tagsという変数名が重複しました。
これは、Bakeしないで一から書いていけば問題ないと思います。

投稿2016/08/05 22:53

KatsumiTanaka

総合スコア924

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

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

kenkbou

2016/08/06 01:52

ありがとうございます。試してみます!
kenkbou

2016/08/06 03:31

すみません、いま自分で回答案を書いたらベストアンサーに選べなくなってしまいました。 失礼しました。 この度はありがとうございます。
guest

0

自己解決

結局、Helperを活かした良い方法が見つからず下記のようにしました。

PHP

1/* 2* 3* 取得時 4* 5*/ 6$tags = $this->Tags->getTags(); 7$myTags = $this->Tags->getMyTags($this->Auth->user('id')); 8 9foreach ($tags as $k => $tag) { 10 if (in_array($tag, $myTags)) { 11 $workplace[$k] = ["tagName" => $tag, "flag" => 1]; 12 } else { 13 $workplace[$k] = ["tagName" => $tag, "flag" => 0]; 14 } 15} 16 17 18/* 19* 20* template 21* 22*/ 23<?php foreach ($tags as $key => $tag) : ?> 24 <?= $this->Form->input('tmptags.' . $key . '.tagName', [ 25 'label' => $tag['tagName'], 26 'class' => 'form-control', 27 'type' => 'checkbox', 28 'value' => $tag['tagName'], 29 'checked' => $tag['flag']=="1"?true:false 30 ] 31 ) ?> 32 33<?php endforeach; ?> 34 35 36/* 37* 38* Post時 39* 40*/ 41// Tag 全件削除 42$res = $this->Tags->deleteAllTag($this->Auth->user('id')); 43if (!$res) { 44 $this->Flash->error(__('one more time')); 45 return $this->redirect(['action' => 'XXX']); 46} 47 48// 有効タグの選定 49foreach ($this->request->data['tmptags'] as $k => $tag) { 50 if ($tag['tagName'] != "0") { 51 $this->request->data['tags'][$k]["tagName"] = $tag['tagName']; 52 } 53} 54 55$user = $this->Users->patchEntity($user, $this->request->data, ['associated' => 'Tags']); 56 57// Tags 新規保存 58if ($this->Users->save($user)) { 59 $this->Flash->success(__('OK')); 60 return $this->redirect(['action' => 'XXX']); 61} else { 62 $this->Flash->error(__('one more time')); 63}

ご回答頂いたKatsumiTanakaさんありがとうございました!

投稿2016/08/06 03:31

kenkbou

総合スコア151

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問