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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

CakePHP

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

Q&A

解決済

2回答

4350閲覧

CakePHP3のGETで受け取ったパラメータのDB追加の仕方

cookie.

総合スコア14

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2017/01/29 05:06

編集2017/01/30 01:34

###質問概要
表題の通り、CakePHP3のフォームでないGETで受け取ったパラメータのDB追加の書き方が知りたく、
質問させて頂きます。
フォームによるPOST、GETのパラメータのDB追加の書き方は教科書などにも載っているのですが、メールの本文に書かれているようなリンクをクリックすることによってGETでパラメータを渡しDBに追加するという処理をリンク先のページで済ませる書き方についてそもそもCakePHP3の情報が少なく、ご指摘頂きたく存じ上げます。
知っている方がいれば、ご指摘頂ければ大変助かります。
よろしくお願いします。
###前提条件

  • DBについて

CakePHPのDB接続は既に済んでいる上で、
hogehogesというテーブルに
idというA_I_のINTカラム、
次にnameというTEXTカラムを設定してあると仮定します。

  • リンクについて

http://hoge.co.jp/cake/hogehoges/test?name=suzuki
というリンクがメール本文にあるとさせてもらいます。

  • Templateについて

CakePHP

1test.ctp 2 3<!---必要があればここにも処理を書きたい---> 4<div class="content"> 5DB追加が完了しました。 6</div> 7
  • Controllerについて

CakePHP

1hogehogesController.php 2 3<?php 4namespace App\Controller; 5use Cake\ORM\TableRegistry; 6 7class HogehogesController extends AppController { 8 public function initialize(){ 9 $this->name = 'Hogehoges'; 10 $this->viewBuilder()->autoLayout(true); 11 $this->viewBuilder()->layout('hogehoges'); 12 } 13 public function index(){ 14} 15 public function test(){ 16//必要があればここに処理を書きたい 17$hogeVal = $this->request->query('hoge'); 18$table = TableRegistry::get('hogehoges'); 19$newData = $table->newEntity(); 20$newData->hoge = $hogeVal; 21$table->save($newData); 22} 23} 24
  • モデルについて

TableフォルダにHogehogesTable.php
EntityフォルダにHogehoge.php
というファイルをそれぞれ、内容も問題なく用意してあると仮定させてもらいます。

###自分で調べたこと
上記でも触れた通り、自分の持っている教科書では、Formを通じてのパラメータのカラム追加しか書いておらず、また検索エンジンで調べたところ、そもそもCakePHP3の記事が少なく、あったとしてもPOSTパラメータの記事が多く参考になりそうなものは見当たりませんでした。
$this->request->queryでGETパラメータを取得する、というところまでは辿り着きましたが、
肝心のDB追加ができません。

ただ、教科書を熟読していて気がついたのは、
POSTによるページ遷移の受け渡し等では、
テンプレート側に$this->Form->create($entity・・・
コントローラ側に$this $this->set('entity',$this->Reviewresults->newEntity());・・・
といったページ遷移前にフォームとエンティティを関連づける処理が書かれており、
この点が、リンクをクリックする仕様では、そのままでは書けず、つまづいている原因になっていると考えています。
もしご存知の方がいれば、ご指摘頂ければ有り難いです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

クエリパラメータやカラム名はhogeではなくnameだと思います。

php

1public function test(){ 2 $nameVal = $this->request->query('name'); 3 $table = TableRegistry::get('hogehoges'); 4 $newData = $table->newEntity(); 5 $newData->name = $nameVal; 6 $table->save($newData); 7}

余談ですが...
ControllerでTableにアクセスする場合、TableRegistry::get()よりloadModel()を使うのが一般的です。

php

1public function test(){ 2 $this->loadModel('Hogehoges'); 3 $entity = $this->Hogehoges->newEntity(); 4 $entity->name = $this->request->query('name'); 5 $this->Hogehoges->save($entity); 6}

※必要ならクエリパラメータがなければ保存しないとか入れておいたほうがいいかもしれませんね。

投稿2017/01/30 02:00

編集2017/01/30 02:07
popobot

総合スコア6586

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

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

cookie.

2017/02/03 03:19

大変助かりました。 ありがとうございました。
guest

0

queryで取得した値をモデルを使用してデータに突っ込めばいいのでは?

php

1use Cake\ORM\TableRegistry; // useをコントローラに追加 2 3$hogeVal = $this->request->query('hoge'); 4$fugaVal = $this->request->query('fuga'); 5$table = TableRegistry::get('table'); 6$newData = $table->newEntity(); 7$newData->hoge = $hogeVal; 8$newData->fuga = $fugaVal; 9$table->save($newData);

投稿2017/01/29 05:25

編集2017/01/29 06:58
turbgraphics200

総合スコア4267

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

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

cookie.

2017/01/29 05:47 編集

貴重なご回答有難うございます。 ご指摘のコードは、Controllerファイルに書けばいいのでしょうか。
cookie.

2017/01/29 05:50

返信有難うございます。 前回の質問に引き続き重ねて申し訳ないですが、 $newData = $->newEntity();という部分は $newData = $table->newEntity();で間違いないですか 勘違いならすみません。
turbgraphics200

2017/01/29 05:51

すいません。抜けてましたね。そうです
cookie.

2017/01/29 05:58

有難うございます。了解しました。 Error: Class 'App\Controller\TableRegistry' not found というエラーが出るのですが、 $table = TableRegistry::get('table');の部分は何か他に必要な記述あるいはファイルが必要なのでしょうか
turbgraphics200

2017/01/29 06:10

ごめんなさい。エンティティに書くべきところと、コントローラーに書くべき部分を分けました。
cookie.

2017/01/29 06:30

とんでもないです。有難うございます。 どの部分がテーブル名かご指摘いただいてもよろしいですか。 よろしくお願いします。
turbgraphics200

2017/01/29 06:41

TableRegistry::get('table'); の 'table' の部分です
turbgraphics200

2017/01/29 06:55

ごめんなさい。やはり、回答をコントローラーのみに修正しました。コントローラーにuse Cake\ORM\TableRegistry;を追加すればエラーは出ないと思います。
cookie.

2017/01/29 06:56

返信有難うございます。 了解しました。 Error: Call to a member function newData() on boolean というエラーが出るのですが、 考えられる原因をご指摘いただけますか
cookie.

2017/01/29 06:57

すみません直前の質問は無視してください。 有難うございます。
cookie.

2017/01/29 20:54

修正ありがとうございます。 エラーは出ないですが、 実際のレコード追加が上手くいきません。
popobot

2017/01/30 01:12

現時点でのコードを質問に掲載されたらどうでしょうか
cookie.

2017/01/30 01:42

ご指摘有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問