【问题标题】:Retrieve multiple data Cakephp 3检索多个数据 Cakephp 3
【发布时间】:2016-06-27 14:02:42
【问题描述】:

我有 2 个表(用户和技术),我需要在第三个控制器中分别从它们检索数据。

我可以使用 loadmodel 和 find() 来做到这一点,然后通过 $this->set() 设置要查看的数据,但是这样做网站会变得非常慢 > 70 秒,当我尝试只检索一个时它运行得很快。

所以基本上我需要优化我的查询并加速我的数据库

这是我的代码。

$users = $this->loadModel('Users');


    $datas=$users->find('all')->select(['id','phone', 'first_name','last_name','birthday','email','website', 'address', 'resume', 'cv_url'])->where(['id' => 1])->bufferResults(false)->ToArray();


    $technologies = $this->loadModel('Technologies');
    $technologies=$technologies->find('all')->select(['id', 'name', 'slug', 'image', 'exp', 'exp_perc'])->bufferResults(false)->ToArray();

    $this->set(compact('datas','technologies'));

一些 DebugKit 图像

如您所见,我只有 2 个查询,但在调试中显示 10 个,TABLE_SCHEMA 耗时 35322 毫秒,调用了 2 次 (35322*2)

欢迎提出任何建议。

【问题讨论】:

  • 我建议您在问题中添加更多信息,因为它是一个不可重现的问题,因此您可能不会得到太多帮助。比如,您使用的是什么 DBMS?生成的查询是什么样的?正在检索多少条记录?究竟花在哪里(使用分析器来弄清楚)?等等……

标签: cakephp model-view-controller cakephp-3.2


【解决方案1】:

您应该使用TableRegistry,而不是加载模型并创建选择查询(这会增加查询时间)。

例如,您应该使用$usersTable = TableRegistry::get('Users'); 而不是$users = $this->loadModel('Users');,之后您可以使用$query = $usersTable->find('all')->..... 查询您的数据并使用foreach($query as $row) 迭代查询的行。

考虑到它不会加载您的整个“用户”模型并且只使用您可以通过 cakePHP 查询轻松操作的用户表,它应该会更快。

这里有一些详细信息:http://book.cakephp.org/3.0/en/orm/table-objects.html#getting-instances-of-a-table-class

希望对你有帮助! ;)

【讨论】:

  • 我已经试过了,问题是直接在服务器上工作。并且在调试模式下,执行查询需要大量时间。我已经在 localhost 上尝试过了,即使调试模式设置为 true,它也能正常工作。
猜你喜欢
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多