【发布时间】:2019-03-26 18:01:42
【问题描述】:
假设我有一个作者和文章表。一篇文章可以有多个作者。所以这是一对多的关系。我创建了一个文章类和一个作者类。
class author
{
private $id;
private $name;
public function __construct($array)
{
foreach($array...
}
// getters...
// setters...
}
class article
{
private $id;
private $title;
private $content;
private $author = array();
public function __construct($array)
{
foreach($array...
}
// getters...
// setters...
public function setAuthor(author $author)
{
$this->author[] = $author;
}
}
注意 setAuthor,一个 setter 依赖注入。它需要一个作者对象来保持一对多的关系(一篇文章,许多作者)。
我从数据库中检索一篇文章及其作者。
$sql = $db->prepare("SELECT article.id AS id_article, title, content,
GROUP_CONCAT(author.id SEPARATOR ';') AS id_author,
GROUP_CONCAT(name SEPARATOR ';') AS name FROM article ar
INNER JOIN author au ON ar.id=au.article_id
WHERE article.id=:id GROUP BY article.id");
$sql->bindValue(':id', $id, PDO::PARAM_INT);
sql->execute();
$fromDb = $sql->fetch();
现在我必须构建对象,对吧?
$article['id'] = $fromDb['id_article'];
$article['title'] = $fromDb['title'];
$article['content'] = $fromDb['content'];
$id_author = explode(';', $fromDb['id_author']);
$name = explode(';', $fromDb['name']);
$newArticle = new article($article);
foreach($id_author as $key => $value)
{
$author['id'] = $value;
$author['name'] = $name[$key];
$newArticle->setAuthor(new author($author));
}
我觉得最后一部分很重,不实用。我不确定这是正确的方法。多对多关系也会出现同样的问题。
在这种特殊情况下,从 db 获取数据后如何使用对象?
【问题讨论】:
-
"应该这样吗?"应该怎么做?给定一篇文章,返回它的文章数组?确切的输入和输出是什么? “我不想使用任何 ORM。”你想用什么做?再次,明确说明包括 DB 和 DBMS API 在内的输入。给minimal reproducible example。 PS 尽可能多地推送到一个数据库查询中——大概所有这些都到 CSV。
-
我只是在 PHP OOP 中手工编写自己的代码。 SQL 请求很简单。
-
应该怎么做:处理内连接和与php oop的一对多关系。正如标题所说。如何将文章类和作者类与我检索的数据一起使用。
-
请通过编辑而非 cmets 进行澄清。 PS你还没有回答我第一条评论中的问题。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。
-
您似乎在询问名为 Active Records 的东西。具体如何处理加载或水合它们。我建议您研究 Active Records,特别是“延迟加载”和“急切加载”。
标签: php inner-join one-to-many