2012-03-08 39 views
0

我有4个班,每个都有自己的数据库表:表连接翻过多个数据库表和对象在PHP和MySQL

  • GlobalObject
  • 图片
  • 项目

GlobalObject有3个属性

  • global_object_id
  • added_by
  • datetime_added

映像,项目和页面有许多不同的领域,它们都具有虽然以下几点:

  • ID
  • global_object_id(外键)

目前,我的类结构有图像,项目和页面作为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); 

而且图像是包括父类中的所有内容(存储在单独的表中)

请询问是否有任何不清楚的地方。

+0

我不知道,你就完蛋了。您是否在使用任何对象关系映射库,如Doctrine?或者你想建立自己的?也许这个链接将有助于:[SO - 良好的PHP ORM库?](http:// stackoverflow。com/questions/108699/good-php-orm-library) – bfavaretto 2012-03-08 18:54:55

+0

全是我自己的。基本上,我希望父类可以通过与子类不同的表来设置,但是在设置子类后所有的属性都可用。 – Alex 2012-03-08 18:56:28

+0

好的,但你需要特别帮助哪些方面?创建MySQL查询?创建你的类方法?都?如果它们都是,你的问题可能是广泛的stackoverflow ...和/或你应该使用这个第三方库。 – bfavaretto 2012-03-08 19:06:13

回答

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;