Как абстрагировать класс объекта базы данных php для работы с переменными столбцами - PullRequest
0 голосов
/ 03 июня 2019

У меня есть класс PHP, экземплярами которого являются строки в моей таблице базы данных. У класса есть методы, которые позволяют создавать, читать, обновлять и удалять строки, соответствующие данному экземпляру класса. Он работает хорошо, как есть, но я в настоящее время явно называю каждый из столбцов базы данных в моем коде. В результате, когда я добавляю или удаляю столбцы (время от времени, но не редко), я должен обновить класс, включив в него имена столбцов. Я хотел бы абстрагировать мой код, чтобы он сначала запрашивал базу данных, чтобы определить, какие столбцы нужно заполнить. (Кстати, я работаю с PHP 7.2)

Код ниже - это то, что у меня сейчас есть, но я не знаю, как его абстрагировать, чтобы он не был привязан к конкретному названию каждого столбца.

<?php
class Example extends DatabaseObject {
    static protected $table_name = "data";
    static protected $db_columns = ['id','column1', 'column2', 'column3', 'column4'];

    public $id;
    public $column1;
    public $column2;
    public $column3; 
    public $column4;

    public function __construct($args=[]) {
        $this->column1 = $args['column1'] ?? '';
        $this->column2 = $args['column2'] ?? '';
        $this->column3 = $args['column3'] ?? '';
        $this->column4 = $args['column4'] ?? '';
    }

    public function attributes() {
      $attributes = [];
      foreach (static::$db_columns as $column) {
        if ($column === "id") { continue; }
        $attributes[$column] = $this->$column;
      }
      return $attributes;
    }

    public function save() {
        // calls private methods to validate, sanitize, then create or update, acc. to context
        // to create, it preps an sql statement based on a call to attributes()
    }

}
?>

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Я не уверен, как далеко вы хотите взять это.Это один из способов абстрагирования данных для строки.

Вы заметите, что я использую функции set и get для доступа к данным.

class Example extends DatabaseObject {
    static protected $table_name = "data";
    static protected $db_columns = ['id', 'column1', 'column2', 'column3', 'column4'];

    public $id;
    protected $data = [];

    public function __construct($args=[]) {
        foreach(self::$db_columns as $columnName) {
            if ( isset($args[$columnName]) ) {
                $this->data[$columnName] = $args[$columnName];
            }
        }
    }

    public function set($columnName, $value)
    {
        if ( in_array($columnName, $this->data) && isset($this->data[$columnName]) ) {
            $this->data[$columnName] = $value;
        }
    }

    public function get($columnName)
    {
        if ( isset($this->data[$columnName]) ) {
            return $this->data[$columnName];
        }
        return null;
    }

    public function attributes() {
      $attributes = [];
      foreach (static::$db_columns as $columnName) {
        if ($column === "id") { continue; }
        $attributes[$columnName] = $this->data[$columnName];
      }
      return $attributes;
    }

    public function save() {
        // calls private methods to validate, sanitize, then create or update, acc. to context
        // to create, it preps an sql statement based on a call to attributes()
    }
}
0 голосов
/ 03 июня 2019

Возможно, вам придется взглянуть на магические методы __get() и __set(). По сути, это методы класса, которые запускаются при попытке получить доступ к свойству, которого нет в вашем классе, поэтому вы можете использовать для них запасной вариант.

Пожалуйста, ознакомьтесь с документацией: https://www.php.net/manual/en/language.oop5.overloading.php#object.set

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...