PHP: деление множественного выбора на несколько объектов / структура объекта - PullRequest
0 голосов
/ 26 марта 2012

позвольте мне сначала заявить, что мы используем базу данных php и postgre.В нашем проекте мы решили не использовать ORM из-за его перегрузки SQL-запросов, и мы выбираем противоположный путь.

Представьте, что у вас есть выбор из нескольких таблиц, скажем, объединенных в столбцах идентификаторов.Например:

  • таблицы: пользователи (идентификатор, имя), элементы (идентификатор, имя, описание), комментарии (идентификатор_пользователя, идентификатор_позиции, текст, рейтинг)

Итакв основном у вас есть таблица пользователей, таблица некоторых элементов и таблица комментариев, которые относятся к одному пользователю и одному элементу.

Вы создаете два объекта - пользователя и элемент, представляющие их строку таблицы.И тогда вы хотите создать объект комментария.В ORM он будет содержать объекты user и item, и они будут загружать себя своими запросами, но это будет два запроса, и вы подумаете ... хм, но я могу выбрать эти данные одним запросом ... но как?

Представьте, что у вас есть этот выбор:

  • SELECT * FROM comments JOIN users ON comments.user_id = users.id JOIN items ON comments.item_id = items.id

(вы можете также представить предложение WHERE с указанным идентификатором элемента или идентификатором пользователя и т. Д.)

Итак, как бы вы разбили результат такого выбора на структуру этого класса, скажем, вам нужен список объектов комментариев:

  • user
  • item
  • комментарий (содержит ссылки на пользователя и объект элемента)

До сих пор нашим теоретическим решением было префикс имени столбцов с фиксированными префиксами :), а затем распространение результата в объектструктура и каждый объект берет то, что ему нужно от выбора.Любые другие решения?Скажем более изощренным?

Спасибо за любые идеи

PS: очевидно, я использовал очень простой пример, но постараюсь представить, что проблема намного больше, а структура гораздо сложнее

1 Ответ

1 голос
/ 26 марта 2012

Прежде всего, вы могли бы получить выгоду, взглянув на шаблон Data Mapper .Простой вариант использования с будет выглядеть так:

$user = new User;
$mapper = new UserMapper( $db );
$user->setName('foobar');
$mapper->fetch( $user );
if ( $user->isBanned() )
{
    throw new Exception('get out !');
}
$user->setLastActive( time() );
$mapper->store( $user );

Что касается отдельного запроса с данными: это не важная часть.Вы просто ALIAS это как требуется (о ... и я надеюсь, что вы не используете * для выбора строк).Важным моментом является создание графа объектов из выбранных данных.Там, где вы используете строителей / фабрики.

//the rest of PDO-related code 
$data = $statement->fecth(PDO::FETCH_ASSOC);
$comment = $commentFactory->build($data);

Где $commentFactory - это экземпляр CommentFactory:

class CommentFactory
{
    public function build( $params )
    {

        $author = new User;
        $subject = new Item;
        $comment = new Comment( $author, $subject );

        $author->setId( $params['user_id']);
        $author->setName( $params['user_name']);

        $subject->setId( $param['item_id']);

        $comment->setContent( $param['content']);

        return $comment;
    }
}

Кроме того, с помощью такой настройки вы можете легко изменить $comment сделано, просто изменив, какой класс является $commentFactory экземпляром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...