【问题标题】:how to handle inner join and one to many relation with OOP?如何处理内部联接和与 OOP 的一对多关系?
【发布时间】: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


【解决方案1】:

您可以使用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);

【讨论】:

  • 你的 $items 是我的 $fromDb。
猜你喜欢
  • 2016-04-24
  • 2022-11-13
  • 2011-02-09
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2011-12-18
相关资源
最近更新 更多