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

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

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

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

4002閲覧

cakephp3でfindの結果をajaxで返す

TomoKubota

総合スコア53

CakePHP

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/04/21 03:50

編集2017/04/21 05:47

cakePHP3.4を使用しています。

ajaxでpostした値を元に、コントローラー側でfindした結果を返すには、
どのように記述すればいいのでしょうか?
cakePHP2の時は簡単にできたのですが、
cakePHP3になってモデル周辺の機能が変わり、どのように書いたらいいかわからなくなってしまいました。

現状、以下のように記述しているのですが、エラーとなってしまいます。

php

1 public function checkDataRegisteredByAjax(){ 2 $this->autoRender = false; 3 if($this->request->is('ajax')){ 4 $param = $_POST['param']; 5 $result = $this->AvailableProducts->find() 6 ->where(['available_products.farmers_id' => 1]) 7 ->where(['available_products.products_id' => 3]); 8 $json = json_encode($result); 9 echo($json); 10 return; 11 } 12 } 13

javascript

1 2 $.ajax({ 3 url: href + "/checkDataRegisteredByAjax", 4 type: "POST", 5 data: { "param": param }, 6 dataType: "json", 7 success : function(response){ 8 console.log(response); 9 return; 10 //通信が成功した場合 11 if(response != false){ 12 13 } 14 }, 15 error: function(response){ 16 alert('通信失敗'); 17 } 18 });

sql

1//Cakeで作成されたSQL 2SELECT 3 AvailableProducts.id AS `AvailableProducts__id`, 4 AvailableProducts.farmer_id AS `AvailableProducts__farmer_id`, 5 AvailableProducts.vegetable_id AS `AvailableProducts__vegetable_id`, 6 AvailableProducts.available_amount AS `AvailableProducts__available_amount`, 7 AvailableProducts.info AS `AvailableProducts__info`, 8 AvailableProducts.preserve_advice AS `AvailableProducts__preserve_advice` 9FROM available_products AvailableProducts 10WHERE (AvailableProducts.farmer_id = :c0 AND AvailableProducts.vegetable_id = :c1)

sql

1SELECT 2 AvailableProducts.id AS `AvailableProducts__id`, 3 AvailableProducts.farmer_id AS `AvailableProducts__farmer_id`, 4 AvailableProducts.vegetable_id AS `AvailableProducts__vegetable_id`, 5 AvailableProducts.available_amount AS `AvailableProducts__available_amount`, 6 AvailableProducts.info AS `AvailableProducts__info`, 7 AvailableProducts.preserve_advice AS `AvailableProducts__preserve_advice` 8FROM available_products AvailableProducts 9WHERE (AvailableProducts.farmer_id = 1 AND AvailableProducts.vegetable_id = 4)

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

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

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

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

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

guest

回答1

0

ベストアンサー

CakePHP3のRequestHandlerコンポーネントを使えば、Ajax側でdataType:'json'が指定されていれば、_serializeにセットした変数を自動的にjsonで返してくれますよ。

php

1 public function initialize() 2 { 3 parent::initialize(); 4 $this->loadComponent('RequestHandler'); 5 } 6 7 public function checkDataRegisteredByAjax() 8 { 9 if($this->request->is('ajax')){ 10 $param = $_POST['param']; 11 $result = $this->AvailableProducts->find() 12 ->where(['available_products.farmers_id' => 1]) 13 ->where(['available_products.products_id' => 3]); 14 $this->set(compact('result')); 15 $this->set('_serialize', ['result']); 16 } 17 }

javascript

1$.ajax({ 2 dataType: "json", 3 // 以下略 4});

詳細はマニュアルを参照してください。

投稿2017/04/21 04:35

編集2017/04/21 06:06
popobot

総合スコア6586

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

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

TomoKubota

2017/04/21 05:51

ありがとうございます。 指定の通りに修正し、再度実行してみたのですが、やはりエラーとなってしまいました。 SQL自体が間違っているのかも思い、 Ajax側でdataType:'text'にして、発行されているSQLをみたのですが、 特に間違いはないような気がします。 where句の:c0 と:c1 を実際に存在する1 と 4 でDBに実行してみたところ、 きちんとレコードが帰ってきました。 どこがおかしいのか、見ていただくことは可能でしょうか?
popobot

2017/04/21 06:06

どんなエラーでしょうか
popobot

2017/04/21 06:07

すみません。回答に$this->autoRender = false;が残っていましたが、これもいらないです。ただ、エラーとは関係ないかもですが
TomoKubota

2017/04/21 06:08

jsで記載しているこちらのエラーに引っかかってしまいます。 error: function(response){ alert('通信失敗'); }
TomoKubota

2017/04/21 06:11

$this->autoRender = false:を削除したところ、 エラーを出さずに通信できました! 本当に助かりました。ありがとうございます。
popobot

2017/04/21 06:12

ブラウザのデベロッパーツールでレスポンスを見るとエラーがわかると思います。 または一旦$this->request->is('ajax')をコメントアウトしてブラウザからアクセスしてみて、デバックした方が楽かもしれませんね
TomoKubota

2017/04/21 06:18

アドバイス、ありがとうございます。 ちなみにconsole.logで出力したところ、 受け取ったものがjsonデータではではなくObject {result: Array(1)}になっていました。 json形式でSQLの結果レコードのみを渡すことはできるのでしょうか。 もしお時間が許すようでしたら、教えていただけないでしょうか。
popobot

2017/04/21 06:34

javascript上でAjaxでjsonを取得した場合、自動的にObjectやArrayにマッピングされるので、それであっていると思いますよ console.log(response.result)とかでアクセスできるはずです
TomoKubota

2017/04/21 06:41

はい、確かにアクセスできました。 正しい作法を習得でき大変嬉しいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問