簡體   English   中英

如何處理內部連接和與 OOP 的一對多關系?

[英]how to handle inner join and one to many relation with 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,一個 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 獲取數據,如何使用對象?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM