1

我试图弄清楚如何在 PHP 中建模数据库关系。比如说我有一个 User 类和一个 Book 类。一个用户有很多书(一对多)。

我在你可以做的框架中看到,

$books = getUser($id)->getBooks(); 检索属于具有 $id 的用户的所有书籍。

所以我考虑过这样做(我不想使用框架或 ORM),1.首先获取用户 2.获取属于用户的书籍(两个 SQL 查询)或 1.获取属于用户的所有书籍使用 sql 连接查询。

我希望这是通用的,因此它可以适用于许多不同的场景,例如。用户有很多书,书有很多评论等等..

提前致谢。约翰

4

1 回答 1

1

做一些通用的事情称为 ORM(例如Doctrine),很难构建一个。

如果你想创建你的模型,一个简单的开始方法是使用代理对象将你的模型与数据库分开:

<?php

class User
{
    protected $id;
    protected $books;

    public function getBooks()
    {
        return $this->books;
    }

    public function fromArray(array $data)
    {
        if (isset($data['id'])) {
            $this->id = $data['id'];
        }
    }
}

class Book
{
    protected $id;
    protected $name;

    public function fromArray(array $data)
    {
        if (isset($data['id'])) {
            $this->id = $data['id'];
        }
        if (isset($data['name'])) {
            $this->name = $data['name'];
        }
    }
}

class UserProxy extends User
{
    public function getBooks()
    {
        $userId = $this->id;
        $booksArr = // do sql query to fetch books belongs to $userId
        $books = array();
        foreach ($booksArr as $bookArr) {
             $book = new Book();
             $book->fromArray($bookArr);
             $books[] = $book;
        }

        $this->books = $books;
        parent::getBooks();
    }
}

您可以通过以下方式改进我的示例:

使用类来管理集合(类似于:Doctrine\Common\Collections\ArrayCollection

使用反射(而不是fromArray方法):


编辑:

这是一个例子:

<?php

$userArr = // fetch your user from database (with an associative array)
$user = new User();
$user->fromArray($userArr);

var_dump($user->getBooks());
于 2011-07-31T15:59:16.127 回答