1

PHP でデータベース関係をモデル化する方法を理解しようとしています。たとえば、User クラスと Book クラスがあるとします。ユーザーは多くの本を持っています (1 対多)。

私はあなたができるフレームワークで見てきました、

$books = getUser($id)->getBooks(); $id を持つユーザーに属するすべての本を取得します。

だから私はそれを(フレームワークやORMを使いたくない)、1.最初にユーザーを取得する2.ユーザーに属する本を取得する(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 に答える