PHP:从数据库获取id,发送到其他函数获取内容?

时间:2012-10-11 06:39:31

标签: php database select methods

我希望标题足够描述,我不知道如何命名。

假设我有以下代码:

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,但随着数据库的不断增长,这个数字会急剧上升,我猜。我需要来改变一些事情。

4 个答案:

答案 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()
    }
}

您可以做的其他事情可以减轻数据库的负担:

  • 每次请求只能连接一次数据库。还可以在多个请求之间共享与数据库的连接。
  • 索引数据库中经常搜索的字段。
  • 仅获取您需要的记录
  • 防止加载相同的记录两次(如果它没有改变)