【问题标题】:CakePHP Find functionCakePHP 查找功能
【发布时间】:2012-09-15 11:58:16
【问题描述】:

我正在使用以下语句。

$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

【问题讨论】:

  • 显示你的用户模型结构,你和其他表没有关系吗?
  • 更新了问题@MoyedAnsari
  • 实际上有多少行? phpmyadmin 中的计数是近似值,如脚注所示。执行find->('all') 并输出计数结果;然后看看是否真的有 200 个结果;或任何重复等。也尝试清除缓存
  • @Ross 很少有记录被重复多达 15 次。尤其是第一张唱片。 php 管理员说有 174 个,如图所示
  • @Harsha M V - 在您的 AppModel 中,执行以下操作:public $recursive = -1;

标签: cakephp cakephp-2.1 cakephp-2.2


【解决方案1】:

您正在运行的查询与 CakePHP 将实际执行的查询几乎不匹配。 CakePHP 还将执行所有必需的连接以获取相关数据。所以,这并不是你正在做的真正正确的比较。

您的某些关系可能会返回双重结果,例如 User -> CompanyA,但也可能存在 User -> CompanyB 关系,这将为 1 个单个用户触发 2 个结果行。

要查看 Cake 实际执行的查询,请在数据源上使用 getLog 方法,例如:

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

或者使用DebugKit 之类的东西来获取默认情况下包含所有查询的面板(在调试模式下)。

【讨论】:

  • 或者我应该使用 contains 来确保我只得到我想要的?
  • @HarshaMV 就性能而言,可包含总是比获取所有内容更好,因此如果您实际上并不需要所有数据,这始终是一种选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多