我目前正在与我的一位朋友一起为他的所有项目制作作品集,而且看起来很奇怪,我无法制作setFetchMode(PDO :: FETCH_CLASS | PDO :: FETCH_PROPS_LATE,“类命名空间” )在我的项目上工作时处理他的代码。
这是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);
}
}
}
}
然后,这是实现类Entity的Project类:
<?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;
}
}
唯一可行的方法是在fetchAll()中添加PDO :: FETCH_ASSOC,但它不会返回对象而是一个数组。...
在此问题上,您的帮助将非常感谢! :)
答案 0 :(得分:0)
据我所知,没有解决此问题的方法。没有获取模式可以创建将返回的行作为构造函数参数传递的对象。
所以我将代码更改为笨拙但可行的解决方案
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只是获取一个对象并填充其属性,该过程与填充关联数组没有太大区别。
现在,您可以判断其他代码的工作原理:
因此,作为另一个解决方案,您可以解决以下两个问题:将构造函数参数设置为可选,并从属性名称中删除下划线。
前段时间,我在fetching obejects with PDO上写了一篇文章,您可能会发现它很有用。