Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MVC面向对象技术-如何最小化查询并保持灵活性?_Php_Model View Controller_Design Patterns_Oop_Kohana - Fatal编程技术网

Php MVC面向对象技术-如何最小化查询并保持灵活性?

Php MVC面向对象技术-如何最小化查询并保持灵活性?,php,model-view-controller,design-patterns,oop,kohana,Php,Model View Controller,Design Patterns,Oop,Kohana,我在PHP(Kohana)中使用了一个面向对象的MVC框架,并混合了一些技术来完成工作。问题是,我不知道如何保持干净,而不调用每页大量的查询 为了说明我的示例,我将设想我正在设计一个类似堆栈溢出的站点: 我有一个问题的模型类(question\u model),还有一个问题查找器的模型类(question\u finder\u model) 问题库模型主要包含存储问题数据的变量、答案对象数组和一些工厂方法。比如: class question_model { public $questi

我在PHP(Kohana)中使用了一个面向对象的MVC框架,并混合了一些技术来完成工作。问题是,我不知道如何保持干净,而不调用每页大量的查询

为了说明我的示例,我将设想我正在设计一个类似堆栈溢出的站点:

我有一个问题的模型类(
question\u model
),还有一个问题查找器的模型类(
question\u finder\u model

问题库模型主要包含存储问题数据的变量、答案对象数组和一些工厂方法。比如:

class question_model {
    public $question_id,$question_title,$question_body,$answers = array();    
}
class question_finder_model {
    private $question_ids = array();
    public $questions = array() ;   //

    function public find_questions () {
        // executes some SQL to find a list of projects
        // Create a new question_model object for each question and store in $questions
        // for each of these questions store the id in $questions_ids
    }
    function public get_answer_info () {
       // using all the question ids stored in $question_ids:
       // find information about the answers
     }
}
问题查找器包含一个问题\模型对象数组和一个问题ID数组。ID数组由类中的find方法填充,并由其他方法使用。比如:

class question_model {
    public $question_id,$question_title,$question_body,$answers = array();    
}
class question_finder_model {
    private $question_ids = array();
    public $questions = array() ;   //

    function public find_questions () {
        // executes some SQL to find a list of projects
        // Create a new question_model object for each question and store in $questions
        // for each of these questions store the id in $questions_ids
    }
    function public get_answer_info () {
       // using all the question ids stored in $question_ids:
       // find information about the answers
     }
}
因此,我对我的所有模型都使用这种方法,例如,我的用户模型将包含一系列问题对象

问题是它变得很难处理,例如我的问题包含许多答案,每个答案可以包含许多评论等等。如何在没有多个查询的情况下填充所有这些对象。我的意思是,简单的方法是迭代我的问题对象数组,并调用存储在问题类中的函数,该函数获取该对象的答案信息。但我会在每页上打10或100个查询


如果这一切都有点模糊,我道歉,因为这个问题很难清楚地表达出来。非常感谢您的帮助,因为perhpas我的整个模式都有缺陷。

它与PHP的关系实际上没有SQL那么大

要获取一个问题的答案列表(包括注释),您可以按问题id获取所有答案。然后,将所有答案id收集到一个数组中,并获取该数组中具有答案id的所有注释

这是三个问题。您只需要在代码中找出哪个注释属于哪个答案——如果您按照答案id对注释进行排序,可以加快排序速度,等等

您还可以使用memcached将内容缓存到文件或其他文件中,这样可以很好地加快速度


当然,从这样的结构中构建对象可能比每次查询都要复杂,但这是您只需要做的事情。

Jani Hartikainen对此做了很好的总结,我还想提到其他一些事情

当你学会了OOP, 一切都开始变得像一场灾难 反对

虽然所有东西都可以声明为类并被视为对象,但您不必这样做。在您的示例中,它可能更容易被视为海量数据操作,而不是处理单个问题/答案/注释对象


一旦你从这个角度看问题,你可能会想出像Jani自己一样的解决方案。

你在这里表达的是最常见的问题之一 带着天真的说谎者。 生成多个查询

您可以在此处阅读问题的精确描述:

基本上,问题是您需要对以下内容执行多个查询:

foreach ($questions in $site) {
 foreach ($question as $questions) {
    foreach ($answer in $question){
       foreach ($comment in $answer) {
         echo "$site->title, $question->title, $answer->title, $comment->title";
       }
    }
 }
}

它变得非常慢,非常快

您需要做的是使用适当的联接获取one查询中的所有信息。 然后填充对象

在一些文章中寻找建议的实现:Class::ReluctantORM — 强制预取


最后,不要挂断电话,试着把每一个案子都做好。关系模型和对象模型“阻抗失配”不是一个已解决的问题。所以不要试图自己完美地解决它。毕竟

“最后,不要挂断电话,试着把每一个案子都做好。”