teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2019/08/09 06:02

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -2,4 +2,108 @@
2
2
  で、checkbox作る際もそのマスタデータから作る。
3
3
 
4
4
  どう組もうとしているか分かりませんが、strposだと同じ名前を含む長い名前があったときを加味すると処理が難しくなるのでは?
5
- implode()で結合して保存したのでしたら取り出すときはexplode()で分解して対応されると良いです。
5
+ implode()で結合して保存したのでしたら取り出すときはexplode()で分解して対応されると良いです。
6
+
7
+ # 考え方など詳細追記
8
+
9
+ 入力画面基本形(DBに持った前提で配列にしています。)
10
+ ```php
11
+ $display_master = [
12
+ ['value'=>'user_name','label'=>'名前'],
13
+ ['value'=>'lastname','label'=>'名'],
14
+ ['value'=>'firstname','label'=>'苗字'],
15
+ ];
16
+
17
+ foreach($display_master as $row){
18
+ echo '<input type="checkbox" name="display[]" value="'.$row['value'].'">'.$row['label'].'<br />'.PHP_EOL;
19
+ }
20
+ ```
21
+ 登録されるデータ:`user_name/firstname`
22
+
23
+ 編集時画面
24
+ ```php
25
+ $display = 'user_name/firstname';
26
+ $display_array = explode('/',$display);
27
+
28
+ foreach($display_master as $row){
29
+ echo '<input type="checkbox" name="display[]" value="'.$row['value'].'"'.(in_array($row['value'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL;
30
+ }
31
+ ```
32
+
33
+ ただし。
34
+ もしかしたらここで定義している[value]の設定値も名前が変わる可能性があるかもしれません。
35
+ valueに設定するのは文字列ではなく数値、IDのようなもののほうが良い気がします。
36
+
37
+ 入力画面基本形
38
+ ```php
39
+ $display_master = [
40
+ ['id'=>1,'value'=>'user_name','label'=>'名前'],
41
+ ['id'=>2,'value'=>'lastname','label'=>'名'],
42
+ ['id'=>3,'value'=>'firstname','label'=>'苗字'],
43
+ ];
44
+
45
+ foreach($display_master as $row){
46
+ echo '<input type="checkbox" name="display[]" value="'.$row['id'].'">'.$row['label'].'<br />'.PHP_EOL;
47
+ }
48
+ ```
49
+ 登録されるデータ:`1/3`
50
+
51
+ 編集時画面
52
+ ```php
53
+ $display = '1/3';
54
+ $display_array = explode('/',$display);
55
+
56
+ foreach($display_master as $row){
57
+ echo '<input type="checkbox" name="display[]" value="'.$row['id'].'"'.(in_array($row['id'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL;
58
+ }
59
+ ```
60
+
61
+ で、本題の「該当ユーザーにはその選択されたカラムしか表示しない」
62
+
63
+ マスタデータに対してSELECTを掛けるわけですがにこんな感じにします。
64
+ ```SQL
65
+ SELECT * FROM display_master where id in (1,3);
66
+ ```
67
+
68
+ こうすると「その人に設定したdisplay」のマスタ情報だけ取得できる という風になります。
69
+
70
+ ただ、
71
+ データベースをもう少しきちんと活用できれば、うまいことできなくもないです。
72
+ displayはあくまで「ユーザ個々の設定」なので、「1対多」の関係になります。
73
+ ユーザ1つに対して複数設定できるという点ですね。
74
+
75
+ なので、id, passwordなどと一緒に持つのではなく、
76
+ それすらも外に出して下記のように持っておくほうがexplode、implodeを考えなくても良くなります。
77
+
78
+ |user_id|display_id|
79
+ |--:|--:|
80
+ |1|1|
81
+ |1|3|
82
+ |2|1|
83
+ |3|1|
84
+ |3|2|
85
+ |3|3|
86
+
87
+ データの更新は毎回user_idで全delete全insertですね。
88
+
89
+ すると、下記のように同じデータがとってくれるようになります(未検証)
90
+ ```SQL
91
+ SELECT
92
+ *
93
+ FROM display_master
94
+ WHERE id IN (
95
+ SELECT
96
+ display_id
97
+ FROM user_display_data
98
+ WHERE user_id = 1
99
+ );
100
+ ```
101
+
102
+ データの関係図としては簡易に作るとこんな感じ。
103
+ ![イメージ説明](f9095d4011a2497e36da0c4a0183dbac.png)
104
+
105
+ userとuser_display_dataは1対多
106
+ user_display_dataとdisplay_masterは1対1になります。
107
+
108
+
109
+ どれがいいかは色々やってみてご自身で決めてください。