2

私は次のステートメントを使用しています。

$users = $this->User->find('all');

しかし、データベースには 174 行しかありません。しかし、クエリは 200 行を返しています。

コンテンツを出力すると、多くの行が繰り返されていることがわかります。

Cakephp でのこの動作の理由は何ですか?

ここに画像の説明を入力

構造

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `password` varchar(40) NOT NULL,
  `display_photo` varchar(255) DEFAULT NULL,
  `subscription_plan_id` int(11) unsigned NOT NULL,
  `company_id` int(11) NOT NULL,
  `status` tinyint(2) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=177 ;

このステートメントを使用してデバッグしようとすることによって

echo $users = $this->User->find('count');

私は200自体を取得します。

モデル: http://pastebin.com/p4bFPiUz

4

1 に答える 1

2

実行中のクエリは、CakePHP が実際に実行するクエリとほとんど一致しません。CakePHP は、関連するデータを取得するために必要なすべての結合も実行します。したがって、これは実際に行っている適切な比較ではありません。

リレーションの中には のように二重の結果を返すものもありますが、1 人のユーザーに対して 2 つの結果行をトリガーUser -> CompanyAするリレーションもある可能性があります。User -> CompanyB

Cake が実際に実行するクエリを表示するには、次のようにデータソースで getLog メソッドを使用します。

$ds = $this->User->getDataSource();
$log = $ds->getLog();
debug($log);

または、DebugKitのようなものを使用して、デフォルトですべてのクエリを含むパネルを取得します (デバッグ モードの場合)。

于 2012-09-15T12:38:46.010 に答える