setFetchMode (), кажется, не работает и не возвращает объект? - PullRequest
0 голосов
/ 31 мая 2019

В настоящее время я работаю с одним из моих друзей над созданием портфолио для всех его проектов, и, как ни странно, мне не удается создать setFetchMode (PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE, 'Class Namespace' ') работает над своим кодом, пока он работает над моими проектами.

Вот ошибка, возвращаемая PHP:! (https://cdn.discordapp.com/attachments/525023910698156034/583938068311179265/unknown.png)

Вот класс Entity, который содержит функцию __construct () и функцию hydration ():

<?php

namespace App\Entity;

class Entity {

    public function __construct(array $array) {
        $this->hydrate($array);
    }

    public function hydrate($array) {
        foreach ($array as $key => $value) {
            $setter = 'set' . ucfirst($key);
            if (method_exists($this, $setter)) {
                $this->$setter($value);
            }
        }
    }
}

Затем, вот Project Project, который реализует класс Entity:

<?php

namespace App\Entity;

class Project extends Entity implements \JsonSerializable {

    private $_title;
    private $_description;
    private $_imagePath;
    private $_link;
    private $_repoLink;
    private $_creationDate;

    public function jsonSerialize() {
        return [
            'title' => $this->_title,
            'description' => $this->_description,
            'imagePath' => $this->_imagePath,
            'link' => $this->_link,
            'repoLink' => $this->_repoLink,
            'creationDate' => $this->_creationDate,
        ];
    }

    /
     * @return string
     */
    public function getTitle(): string {
        return $this->_title;
    }

    /
     * @param string $title
     */
    public function setTitle(string $title) {
        $this->_title = $title;
    }

    /
     * @return string
     */
    public function getDescription(): string {
        return $this->_description;
    }

    /
     * @param string $description
     */
    public function setDescription(string $description) {
        $this->_description = $description;
    }

    /
     * @return string
     */
    public function getImagePath(): string {
        return $this->_imagePath;
    }

    /
     * @param string $imagePath
     */
    public function setImagePath(string $imagePath) {
        $this->_imagePath = $imagePath;
    }

    /
     * @return string
     */
    public function getLink(): string {
        return $this->_link;
    }

    /
     * @param string $link
     */
    public function setLink(string $link) {
        $this->_link = $link;
    }
/
     * @return string
     */
    public function getRepoLink(): string {
        return $this->_repoLink;
    }

    /
     * @param string $repoLink
     */
    public function setRepoLink(string $repoLink) {
        $this->_repoLink = $repoLink;
    }

    /
     * @return \DateTime
     */
    public function getCreationDate(): \DateTime {
        return $this->_creationDate;
    }

    /
     * @param string $creationDate
     */
    public function setCreationDate(string $creationDate) {
        $this->_creationDate = new \DateTime($creationDate);
    }
}

И, наконец, вот запрос SQL:

<?php

namespace App\Model;

class ProjectManager extends Manager {

    /**
     * return a collection of Project objects
     * @return Project[]
     * @throws \Exception
     */
    public function getProjects() {
        $db = $this->getDb();
        $q = $db->query(
            'SELECT id,
                     title,
                     description,
                     image_path AS imagePath,
                     link,
                     repo_link AS repoLink,
                     creation_date AS creationDate
            FROM my_website_projects
            ORDER BY creationDate'
        );

        $q->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'App\Entity\Project');
        $projects = $q->fetchAll();

        return $projects;
    }
}

Единственное, что, кажется, работаетэто добавить PDO :: FETCH_ASSOC в fetchAll (), но тогда он не возвращает объект, а массив ....

Ваша помощь будет высоко оценена по этой проблеме!:)

1 Ответ

0 голосов
/ 31 мая 2019

Насколько я знаю, решения этой проблемы нет.Нет режима выборки, который создает объект, передающий возвращенную строку в качестве параметра конструктора.

Так что я бы изменил код на этот немного неуклюжий, но рабочий вариант решения

public function getProjects() {
    $db = $this->getDb();
    $q = $db->query(
        'SELECT id,
                 title,
                 description,
                 image_path AS imagePath,
                 link,
                 repo_link AS repoLink,
                 creation_date AS creationDate
        FROM my_website_projects
        ORDER BY creationDate'
    );
    $projects = [];
    while($row = $q->fetch(PDO::FETCH_ASSOC)) {
        $projects[] = new App\Entity\Project($row);
    }
    return $projects;
}

Ваша ошибкачто вы немного запутали способ, которым PDO создает объекты.

Этот способ довольно тупой, PDO просто берет объект и заполняет его свойства, процесс не сильно отличается от заполнения ассоциативного массива.

Итак, теперь вы можете сказать, как работал ваш другой код:

  • Во-первых, параметр конструктора в вашем другом классе является необязательным, это означает, что PHP не будет жаловаться на это.
  • секунда, в других ваших свойствах класса пишутся равными именам столбцов в базе данных, и PDO успешно заполняет их, как описано выше.

Итак, в качестве другого решения вы можете исправить эти2 вопроса: сделать параметр конструктора необязательным и удалить подчеркивание из имен свойств.

Некоторое время назад я написал статью о получении объектов с помощью PDO , вы можете найти его полезным.

...