PHP MVC数据库关系对象

时间:2011-07-31 12:56:06

标签: php database oop model-view-controller relationships

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

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

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

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

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

提前致谢。 约翰

1 个答案:

答案 0 :(得分:1)

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

如果您想创建自己的,一个简单的方法是使用proxy objects将您的模型与数据库分开:

<?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

使用Reflection(而不是fromArray方法):


修改

这是一个例子:

<?php

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

var_dump($user->getBooks());