我希望标题足够描述,我不知道如何命名。
假设我有以下代码:
Class Movie_model {
public method getMoviesByDate($date) {
// Connects to db
// Gets movie IDs from a specific date
// Loop through movie IDs
// On each ID, call getMovieById() and store the result in an array
// When all IDs has looped, return array with movies returned from getMovieById().
}
public function getMovieById($id) {
// Get movie by specified ID
// Also get movie genres from another method
// Oh, and it gets movie from another method as well.
}
}
我总是希望在拍摄电影时获得相同的结果(我总是希望得到getMovieById()的结果。
我希望你明白我的观点。我将有许多其他函数,如getMoviesByDate(),我也将有getMoviesByGenre(),我希望它也返回与getMovieById()相同的电影信息。
这样做“好”吗?我知道这会给服务器带来更多负担并增加加载时间,但还有其他更好的方法,我不知道吗?
编辑:我澄清了getMoviesByDate()中的代码。此外,getMovieByDate()只是一个例子。正如我所说,我也会调用像getMoviesByGenre()这样的方法。
编辑:我目前正在项目的首页上运行48个数据库查询,并且首页还远未完成,所以当我完成时,这个数字至少会增加三倍。几乎所有的查询都需要大约0.0002,但随着数据库的不断增长,这个数字会急剧上升,我猜。我需要来改变一些事情。
答案 0 :(得分:1)
我不认为在这种特殊情况下这样工作是好的。函数getMoviesByDate将从单个查询返回一定量的“n”个电影(或电影ID)。对于此查询中的每个id,您将有一个单独的查询来按指定的ID获取影片。
这意味着如果第一个函数返回200个电影,你将运行getMovieById()函数(及其中的查询)200次。更好的做法(IMO)就是在getMoviesByDate()函数中获取所需的所有信息,并将其作为集合返回。
答案 1 :(得分:1)
在getMoviesByDate()
类上使用getMoviesById()
和Movie
方法似乎不合逻辑。
另一种方法是使用某种MovieManager
类来执行所有检索,并返回Movie
个对象。
class MovieManager {
public function getMoviesByDate($date) {
// get movies by date, build an array of Movie objects and return
}
public function getMoviesByGenre($genre) {
// get movies by genre, build an array of Movie objects and return
}
public function getMovieById($id) {
// get movie by id, return Movie object
}
}
您的Movie
课程只包含特定于一部电影的属性和方法:
class Movie {
public id;
public name;
public releaseDate;
}
可以使用单独的方法来获取按日期,类型等等,但是你必须确保你没有多次调用相同的记录 - 在这种情况下你需要一个可以加入各种表的查询需要。
编辑 - 在您澄清了问题之后:
按日期获取电影ID,然后通过getMovieById()
运行它们的想法很糟糕!在按日期获取时应该拉动电影数据,因此您不必再次访问数据库。
答案 2 :(得分:0)
您可以修改 getMovieById 功能。您可以将日期作为参数传递,该函数应按其ID返回电影并按日期过滤。
答案 3 :(得分:-1)
为了跟踪先前已经加载到RAM中的记录,您可以使用模型的基类来保存已加载的记录的id,以及对RAM中的模型对象进行对象的引用。
class ModelBase {
/* contains the id of the current record, null if new record */
protected $id;
// keep track of records already loaded
static $loaded_records = Array();
public function __construct(Array $attr_values) {
// assign $attr_values to this classes attributes
// save this instance in class variable to reuse this object
if($attr_values['id'] != null) {
self::$loaded_records[get_called_class()][$attr_values['id']] = $this;
}
}
public static function getConcurrentInstance(Array $attr_values) {
$called_class = get_called_class();
if(isset(self::$loaded_records[$called_class][$attr_values['id']])) {
// this record was already loaded into RAM
$record = self::$loaded_records[$called_class][$attr_values['id']];
// you may need to update certain fields of $record
// from the data in $attr_values, because the data in the RAM may
// be old data.
} else {
// create the model with the given values
$record = new $called_class($attr_values);
}
return $record;
}
// provides basic methods to update records in ram to database etc.
public function save() {
// create query to save this record to database ...
}
}
你的电影模型看起来像这样。
Class MovieModel extends ModelBase {
// additional attributes
protected $title;
protected $date;
// more attributes ...
public static function getMoviesByDate($date) {
// fetches records from database
// calls getConcurrentInstance() to return an instance of MovieModel() for every record
}
public static function getMovieById($id) {
// fetches record from database
// calls getConcurrentInstance() to return an instance of MovieModel()
}
}
您可以做的其他事情可以减轻数据库的负担: