我正试图找出如何在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());