从多个MySQL表中有效地检索PHP对象

时间:2014-05-08 22:51:25

标签: php mysql class pdo

我有以下PHP类:

user.php的

<?php

class User {
    public $id;
    public $name;
}

?>

Forummessage.php

<?php

class Forummessage {

    public $id;
    public $user_id; // message coming from this user
    public $message;
    public $datetime;

    // Additionally, an object should be able to get the user instances
    public $user; // should be instance of User
}

?>

当然,类属性通常是私有的,可以使用公共setter / getters访问。为了让这个例子尽可能简单,我公开了一切。


此外,假设以下MySQL表。

用户

id   name
------------
1    tester
2    anyuser
...

forummessage

id   user_id   message    datetime
---------------------------------------------
1    1         hello...   2014-04-04 12:00:00
2    2         yoyo...    2014-04-04 12:00:10
...

使用所有属性获取Chatmessage数组的最快且最高效的方法是什么?

现在,我有一个使用此方法的PDO包装类:

/**
 * Performs a query to the database and returns the desired type
 * @param string $statement the pdo query
 * @param array $params the params
 * @param string $returntype optional param (default: 'bool'), should be either 'bool', 'array' or a valid class name
 * @return bool|array returns either a bool depending on the success of the query or an array with the resulting data
 */
function query($statement, $params = array(), $returntype = 'bool');

如果我将有效的类名称传递为$returntype,则此方法使用$stmt->fetchAll(\PDO::FETCH_CLASS, $returntype);以返回类实例数组。

我就是这样做的:

// Automatically generates an array of Forummessage
$arrayOfForummessage = $wrapper->query('
    SELECT
        forummessage.id AS id, // NOTE: I MAKE SURE THE PROPERTIES MATCH TO THE PHP CLASS
        user_id AS user_id,
        message
        datetime,
        name AS user_name // NOTE: NOT USED YET
    FROM user, forummessage
    WHERE user.id = forummessage.user_id
', array(), 'Forummessage');

这很有效,但您可以理解,user属性仍为NULL。您如何确保提供用户属性?如您所见,数据位于查询中。

当然,我可以在Forummessage构造函数中创建一个for循环并查找正确的属性,以便填充创建User的实例并将其分配给Forummessage阶级财产。问题是,当拥有许多属性和许多对象时,这确实很慢。如果您有任何建议,我很想了解更多关于它们的信息。

0 个答案:

没有答案