2017-07-03 42 views
0

我有一个主题列表,默认情况下15,加载更多的按钮,加载15个更多的主题与ajax请求。它需要太多的时间为初始查询来获取前15周的主题,因此我缓存查询,它看起来像这样:CakePHP 3 - 缓存查询限制

$query = "SELECT *, views + views_rom + views_eng + views_rus as views 
    FROM topics Topic 
    LEFT JOIN topics_practices TopicsPractice on (TopicsPractice.topic_id = Topic.id ) 
    LEFT JOIN practices Practice on (TopicsPractice.practice_id = Practice.id) 
    LEFT JOIN topic_comments TopicComment on (TopicComment.topic_id = Topic.id) 
    LEFT JOIN slugs Slug on (Slug.table = 'topics' AND Slug.item_id = Topic.id) 
    WHERE Topic.id IN 
     (SELECT id FROM (
      SELECT t.id 
      FROM topics t 
      LEFT JOIN topic_comments tc on (tc.topic_id = t.id) 
      LEFT JOIN topics_practices tp on (tp.topic_id = t.id) 
      LEFT JOIN topics_tags TopicsTag on (TopicsTag.topic_id = t.id) 
      WHERE $conditions 
      GROUP BY t.id 
      ORDER BY $orderSubsidiary 
      LIMIT $limit 
     ) temp) 
    ORDER BY $order  
    "; 

$topics = Cache::remember(str_replace(' ','_',$conditions).'_setTopics_cache', function() use ($query) { $topics = $this->query($query); }, '5min');

我的问题是,每次我做Ajax请求我回到前15个话题。我的查询限制不会更改。 有没有办法改变我的缓存查询中的限制值?

+0

这看起来像一个可能的SQL注入漏洞,请_ **永远不要** _直接插入(用户)数据到查询中,_ **总是** _使用查询生成器或准备好的语句,即使你处理你认为安全的价值! – ndm

+0

我刚从另一位开发人员那里获得这个项目,试图优化它。不幸的是,他不喜欢ORM的。整个项目都是这样写的。 – httpix

回答

1

更改您的缓存密钥,以某种形式包含您的限制,以便您为每个查询拥有唯一的密钥。当查询发生更改时,密钥也需要更改,以便您可以获取并缓存这些结果,而不是将先前的缓存集用于先前的查询。