Php MVC面向对象技术-如何最小化查询并保持灵活性?
我在PHP(Kohana)中使用了一个面向对象的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
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 — 强制预取
最后,不要挂断电话,试着把每一个案子都做好。关系模型和对象模型“阻抗失配”不是一个已解决的问题。所以不要试图自己完美地解决它。毕竟“最后,不要挂断电话,试着把每一个案子都做好。”