ООП - команды sql внутри класса PHP - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть веб-сайт, написанный на процедурном PHP, и теперь я перекодирую его в (хотя бы частично) стиле ООП, чтобы начать его изучение.Это простая страница, отображающая несколько учебных курсов (название, описание и т. Д.) Из базы данных.Администратор может добавлять или удалять что угодно, поэтому оно должно быть динамичным.Сначала я запустил одну строчку кода:

    $courses=$pdo->run("SELECT id,title,description FROM courses WHERE status=1 ORDER BY id")->fetchAll(PDO::FETCH_CLASS, 'Course');
$cmax = count($courses);

и повторил, например, $courses[3]->description, но мне показалось, что я ничего не делаю, только притворяюсь, что ООП, просто используя многомерный массив.Опять же, это было бы хорошо для целей веб-сайта, но мой вопрос, чтобы привыкнуть к логике ООП, могу ли я сделать это так: я создаю выпадающее меню только с заголовками и идентификаторами из базы данных,и после того, как кто-то нажал, только тогда я создаю объект (чтобы получить описание, дату, учителя, что угодно):

$obj = new Course($pdo,$userSelectedID);
echo $obj->getTitle($pdo);
$obj->showDetails($pdo); // etc

Класс:

class Course {

    protected $id;
    protected $title;
    protected $description;

    public function __construct($pdo,$id) {
        $this->id=$id;
    }

    public function getTitle($pdo) {
        $this->title=$pdo->run("SELECT title FROM courses WHERE id=?",[$this->id])->fetchColumn();
        return $this->title;
    }

    public function getDescription($pdo) {
        $this->description=$pdo->run("SELECT description FROM courses WHERE id=?",[$this->id])->fetchColumn();
        return $this->description;
    }

    public function showDetails($pdo) {
        echo "<h3>".$this->getTitle($pdo)."</h3>".$this->getDescription($pdo);
    }

}

Этонеправильный подход?Можно ли запускать команды sql внутри класса?Особенно, когда мне уже приходилось использовать некоторые данные БД для создания выпадающего меню.Я надеюсь, что мой вопрос имеет смысл.

PS: я слышал, что передача объекта PDO каждый раз не лучшая практика, но я пока не готов сделать это с рекомендованным экземпляром (?)

1 Ответ

0 голосов
/ 09 ноября 2018

Хороший подход заключается в создании классов моделей для каждой таблицы в вашей базе данных.Модель содержит частные атрибуты, соответствующие вашим столбцам таблицы, со связанными получателями и установщиками.Для вашей таблицы курса:

class Course {

    protected $id;
    protected $title;
    protected $description;

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getTitle() {
        return $this->title;
    }

    public function setTitle($title) {
        $this->title = $title;
    }

    public function getDescription() {
        return $this->description;
    }

    public function setDescription($description) {
        $this->description = $description;
    }

}

Тогда у вас есть концепция объектов доступа к данным.Вы можете создать абстрактный класс, который будет расширен вашими объектами доступа к данным:

abstract class AbstractDAO {

    protected $pdo;

    public function __construct($pdo)
    {
        $this->pdo = $pdo;
    }

    abstract public function find($id);

    abstract public function findAll();

    abstract protected function buildModel($attributes);
}

Для вашей таблицы курса:

class CourseDAO extends AbstractDAO {


    public function find($id) {
        $statement = $this->pdo->prepare("SELECT * FROM courses WHERE id = :id");
        $statement->execute(array(':id' => $id));
        $result = $statement->fetch(PDO::FETCH_ASSOC);

        return $this->buildModel($result);
    }

    public function findAll() {
        $statement = $this->pdo->prepare("SELECT * FROM courses");
        $statement->execute();
        $results = $statement->fetchAll(PDO::FETCH_ASSOC);

        $courses = [];
        foreach($results as $row)
            $courses[] = $this->buildModel($row);

        return $courses;
    }

    public function findByTitle($title)
    {
        ...
    }

    public function create(Course $course)
    {
        ...
    }

    protected function buildModel($attributes) {
        $course = new Course();

        $course->setId($attributes['id']);
        $course->setTitle($attributes['title']);
        $course->setDescription($attributes['description']);

        return $course;
    }
}

Современные платформы делают это автоматически, но я думаю, что этохорошо понять, как это работает, прежде чем использовать мощные инструменты, такие как Eloquent или Doctrine

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