как обрабатывать внутреннее соединение и отношение один ко многим с ООП? - PullRequest
0 голосов
/ 26 марта 2019

Допустим, у меня есть таблицы автора и статьи.Одна статья может иметь много авторов.Так что это отношения один ко многим.Я создал класс статьи и класс автора.

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

Я нахожу последнюю часть довольно тяжелой и непрактичной.Я не уверен, что это правильный способ сделать это.Та же проблема возникает со многими отношениями.

Как использовать объекты, когда вы получаете данные из БД в данном конкретном случае?

1 Ответ

0 голосов
/ 26 марта 2019

Вы можете использовать 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);
...