Объединение таблиц по нескольким таблицам и объектам базы данных в PHP и MySQL - PullRequest
0 голосов
/ 08 марта 2012

У меня есть 4 класса, каждый со своими таблицами базы данных:

  • GlobalObject
  • Изображение
  • Проект
  • Страница

GlobalObject имеет 3 свойства

  • global_object_id
  • Added_by
  • datetime_added

Изображение, Проект и Страница имеют много разныхполя, они ВСЕ имеют следующее:

  • id
  • global_object_id (внешний ключ)

В настоящий момент в моей структуре классов есть изображения, проектыи 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);

В настоящий момент я делаю следующее(Используя Image в качестве примера):

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 голосов
/ 08 марта 2012

Очень удобный способ предлагается такими «волшебными методами», как __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;      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...