【问题标题】:PHP MVC database relationship objectsPHP MVC 数据库关系对象
【发布时间】:2011-10-16 21:43:39
【问题描述】:

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

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

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

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

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

提前致谢。 约翰

【问题讨论】:

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


    【解决方案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

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


    编辑:

    这是一个例子:

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

    【讨论】:

    • 你能详细说明你的例子吗?例如我如何使用这个类?你能给我们举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多