PHP MVC объекты базы данных отношений - PullRequest
1 голос
/ 31 июля 2011

Я пытаюсь выяснить, как моделировать отношения с базой данных в PHP.Например, у меня есть класс User и класс Book.У пользователя много книг (от одной ко многим).

Я видел в рамках, которые вы можете сделать,

$ books = getUser ($ id) -> getBooks ();чтобы получить все книги, принадлежащие пользователю с $ id.

Так что я подумал о том, чтобы сделать это либо (я не хочу использовать фреймворки, либо ORM), 1. сначала получить пользователя 2. получить книги, которые принадлежатпользователю (два запроса SQL) или 1. получить все книги, принадлежащие пользователю, с помощью запроса объединения SQL.

Я хочу, чтобы это было общим, чтобы оно могло работать во многих различных сценариях, например, например.у пользователя много книг, у книги много отзывов и тд ..

Заранее спасибо.джон

1 Ответ

1 голос
/ 31 июля 2011

Создание чего-то общего называется 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 )

используйте Reflection (вместо fromArray методов):

<Ч />

EDIT:

вот пример:

<?php

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

var_dump($user->getBooks());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...