PHP MVC数据库关系对象


PHP MVC database relationship objects

我正试图找出如何在PHP中建模数据库关系。例如,我有一个User类和一个Book类。用户有多本图书(一对多)。

我看到在框架中可以这样做,

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

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

我希望这是通用的,所以它可以在许多不同的情况下工作,所以说,例如。用户有很多书,书有很多评论等等。

提前感谢。约翰。

做一些通用的事情被称为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方法):

  • 使用ReflectionClass::getProperties()获取对象属性。
  • 用ReflectionProperty::setAccessible()设置它们为true。
  • 用ReflectionProperty::setValue()绑定它们。

编辑:

这里有一个例子:

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