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

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

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

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

CakePHP

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

Q&A

3回答

8007閲覧

cakephpのhasmanyで結合先のカラムが存在しないというエラー事象

DaikiYamada

総合スコア11

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2015/12/31 07:57

cakeのアソシエーションを勉強し始めましたが早速つまづきましたので
ヘルプ求めます!><

以下のようなエラーがでます。(画像も添付します)
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'User.email' in 'field list'

イメージ説明

食べログのようなものを練習で作ってます。
各お店に複数のユーザーがレビューを投稿できるようにする機能です。
usersテーブルとreviewsテーブルがあり、これらをアソシエーションで連結させたいです。
(foreignKeyはuser_idです)

usersテーブルにはemail.id共に存在するのですが、
なぜか上記のようなエラーが表示されてしまいます。

少し調べると下記のような記事を発見しました。
http://fr-soft.com/cake/?p=32

これと同じような事象でしょうか?
(cakeではjoinが実行されない?)

実コードは以下に記載いたします。

getListByShopIdが各ショップごとのレビューを表示させる
メソッドになります。

<Review.php>

php

1<?php 2 3class Review extends AppModel { 4 public $belongTo = array( 5 'User' => array( 6 'className' => 'User', 7 ), 8 'Shop' => array( 9 'className' => 'Shop' 10 ) 11 ); 12 13 public function isReview ($shopId, $userId) { 14 $review = $this->getData($shopId, $userId); 15 return !empty($review) ? true : false; 16 } 17 18 public function getData($shopId, $userId) { 19 $options = array( 20 'conditions' => array( 21 'shop_id' => $shopId, 22 'user_id' => $userId 23 ) 24 ); 25 return $this->find('first', $options); 26 } 27 28 public function getReviewCnt($userId) { 29 $options = array( 30 'condition' => array( 31 'user_id' => $userId 32 ) 33 ); 34 35 return $this->find('count', $options); 36 } 37 38 public function getListByShopId($shopId) { 39 $options = array( 40 'fields' => 41 array('Review.id', 'Review.user_id', 'Review.title', 'Review.body', 'Review.score', 'Review.created', 'User.email', 'User.id'), 42 'conditions' => array('Review.shop_id' => $shopId), 43 'recursive' => 2 44 ); 45 return $this->find('all', $options); 46 } 47 48 public function getScoreAvg($shopId) { 49 $options = array( 50 'fields' => 'AVG(score) as avg', 51 'conditions' => array('shop_id' => $shopId), 52 'group' => array('shop_id') 53 ); 54 55 $data = $this->find('first', $options); 56 $score = $scoreAve = 0; 57 if (!empty($data[0]['avg'])) { 58 $score = round($data[0]['avg']); 59 $scoreAve = round($data[0]['avg'], 1); 60 } 61 return array($score, $scoreAve); 62 } 63} 64 65?>

<User.php>

php

1<?php 2 3class User extends AppModel { 4 5 public $hasMany = array( 6 'Review' => array( 7 'className' => 'Review' 8 ) 9 ); 10 11 public $validate = array( 12 'email' => array( 13 'validEmail' => array( 14 'rule' => array('email'), 15 'message' => 'メールアドレスを入力してください' 16 ), 17 18 'emailExists' => array( 19 'rule' => array('isUnique', array('email')), 20 'message' => '既に登録済みです' 21 ) 22 ), 23 24 'password' => array( 25 'match' => array( 26 'rule' => array( 27 'confPassword', 'passwordconf' // confPassword(関数名)の呼び出し 28 ), 29 'message' => 'パスワードが一致しません' 30 ) 31 ), 32 33 'passwordold' => array( 34 'match' => array('rule' => array('oldPassword', 'passwordold'), 35 'message' => '旧パスワードが一致しません' 36 ) 37 ) 38 ); 39 40 public function confPassword($field,$colum) { // $columはどこから出てきたのか 41 if ($field['password'] === $this->data['User'][$colum]) { // $field['password'] = password, $this->data['User'][$colum] = passwordconf 42 $this->data['User']['password'] = Authcomponent::password($field['password']); 43 return true; 44 } 45 } 46 47 public function oldPassword($field, $colum) { // $field = usersテーブルのpassword, $colum = passwordold 48 $passwordold = Authcomponent::password($field[$colum]); // $passwordoldの暗号化 49 $row = $this->findById($this->data['User']['id']);// usersテーブルのidを$rowに格納 50 51 if ($passwordold === $row['User']['password']) { // $passwordoldとusersテーブルのpasswordを照合 52 return true; 53 } 54 } 55} 56 57?>

<Shop.php>

php

1<?php 2 3class Shop extends AppModel { 4 public $validate = array( 5 'name' => array( 6 'rule' => array('notBlank') 7 ), 8 9 'tel' => array( 10 'rule' => array('notBlank') 11 ), 12 13 'addr' => array( 14 'rule' => array('notBlank') 15 ), 16 17 'url' => array( 18 'rule' => array('url'), 19 'message' => '形式が正しくありません' 20 ) 21 ); 22 23 public $hasMany = array( 24 'Review' => array( 25 'className' => 'Review', 26 'order' => 'Review.created DESC' 27 ) 28 ); 29} 30 31?>

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

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

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

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

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

guest

回答3

0

continableビヘイビアを設定し、無条件にfindをかけたところ下記のエラーが出ました。

Model "Review" is not associated with model "User"

根本的にアソシエーションの設定が出来ていないと考え、Review.phpの設定箇所を眺めていました。

PHP

1// Review.php 2public $belongTo = array(...

sが抜けてますよ!
$belongsToにすると上手く動作するはずです。

投稿2016/01/05 01:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DaikiYamada

2016/01/05 05:58

おっしゃる通りでした。大変助かりました。。。ありがとうございます
guest

0

Review.phpのgetListByShopId()でエラーが出ているみたいですね。
まずはオプションで'fields'は指定せずに、'conditions'でIDを指定するだけにしてみてはいかがでしょうか。
それだけでもアソシエーション先のデータも取れると思います。

ところで、一度Bakeを試してみるといいかもしれません。
Bakeでは、データベースを設計・作成さえすれば、アソシエーションの設定からコントローラやビューなどの作成まで自動でやってくれます。
出力されたコードは簡潔にまとまっているので、勉強にはおすすめです。

投稿2016/01/02 16:33

coba-coba

総合スコア1409

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

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

0

cakephpでbelongToを使用した場合、自動的にjoin分が発行されます。
エラーSQLを見るとjoinがされていないので、以下のような原因が考えられます。
・アソシエーションの結合キーが違う?
・getListByShopIdを呼び出す前にアソシエーションを無効にするようなコードがある?

投稿2016/01/01 01:32

chiku_

総合スコア1464

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

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

DaikiYamada

2016/01/01 11:15

ありがとうございます! んー、ある動画教材の元進めているため、原因が分からないんですよね。。。 とりあえずその辺りを探してみます。。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問