表连接PHP和MySQL中的多个数据库表和对象

时间:2012-03-08 18:45:23

标签: php mysql oop

我有4个类,每个类都有自己的数据库表:

  • GlobalObject
  • 图片
  • 项目

GlobalObject有3个属性

  • global_object_id
  • added_by
  • datetime_added

图像,项目和页面有许多不同的字段,但它们都有以下内容:

  • ID
  • global_object_id(外键)

目前,我的类结构将Images,Projects和Pages作为GlobalObject类的子类,这允许3个子类访问它们所需的变量,datetime_added等。

我应该如何使用PHP和MySQL设置属性?目前,所有字段(包括global_object表中的字段)都在每个部分的表中(除了没有新表的情况下不能存在的global_object_id除外 - 这就是我需要这样做的原因),所以我从Image请求数据例如,表包含父类中的所有属性,并使用parent :: set_by_row($ database_args)和$ this-> set_by_row($ database_args);

设置

目前,我执行以下操作(以图像为例):

class Image extends GlobalObject
{
$id;
$title;

function set_by_id($id)
{
// Select Q from Image table
$this->set_by_row($db_result);
}

function set_by_row($args)
{
parent::set_by_row($args);
// Set class properties
}

}

重申:我希望能够做到以下几点:

$image = new Image()
$image->set_by_global_object_id(23);

设置图像,包括父类中的所有内容(存储在单独的表中)

如果有任何不清楚的地方,请询问。

1 个答案:

答案 0 :(得分:0)

这些“魔术方法”提供了一种非常方便的方法,例如__get和__set。以下示例提供对数据的只读访问权限,但可以使用__set方法轻松扩展。

abstract class GlobalObject {
    protected $_data = array();

    /* Magic Method: Enable read access via $this->name */
    public function __get($key) {
        if (isset($this->_data[$key])) {
            return $this->_data[$key];
        }
        throw new Exception('Property "'. $key .'" not found.');
    }

    protected function _setFromArray(array $data) {
        // .. do whatever needs to be done with the data ..

        $this->_data = $data;
    }
}

现在只需扩展此类:

class Image extends GlobalObject {
    public function setByGlobalId($id) {
        $result = mysql_query('SELECT i.*, g.* FROM images AS i
            LEFT JOIN global_objects AS g
            ON g.global_object_id = i.global_object_id 
            WHERE i.global_object_id = '. intval($id) .' LIMIT 1');

        // @todo check if result is empty

        $data = mysql_fetch_assoc($result);
        $this->_setFromArray($data);
    }
}

一个简单的例子:

$image = new Image();
$image->SetByGlobalId(42);
echo $image->added_by;