如何处理内部连接以及与 OOP 的一对多关系



假设我有一个作者和文章表。一篇文章可以有多个作者。所以这是一种一对多的关系。我创建了一个文章类和一个作者类。

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,一个二传手依赖注入。它需要一个作者对象来保持一对多关系(一篇文章,许多作者(。

我从数据库中检索了一篇文章及其作者。

$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));
}

我发现最后一部分很重,不实用。我不确定这是正确的方法。同样的问题也发生在多对多的关系中。

在这种特殊情况下,从数据库获取数据后如何使用对象?

您可以使用 PDO。

举个例子:

<?php
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
try {
    $results = $db->query(
          "SELECT *
          FROM articles ar
          INNER JOIN authors au ON ar.id=au.article_id"
    );
} catch (Exception $e) {
    echo "bad query";
    echo $e;
}
$items = $results->fetch(PDO::FETCH_ASSOC);

最新更新