Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Создание кземпляра сложного объекта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vladqa
Отправлено: 04 Декабря, 2012 - 19:26:24
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Привет всем!
Решил начать писать нормальные модели для представления сущностей в проекте.

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

Собственно стокнулся с проблемой инстанцирования моделей.

Предположим, что есть две сущности: тарифные планы и опции, из которых эти тарифные планы и состоят. пусть для простоты будет 2 таблицы: plans, options

Тогда есть 2 модели: Plan, Option.

Если придерживаться объектного подхода, то Объект класса Plan должен содержать в себе массив объектов класса Option из которых он состоит.

Но как такой объект инстанцировать?

Сейчас получается так (упрощенно):

PHP:
скопировать код в буфер обмена
  1.  
  2. Class Plan {
  3.  
  4.    // Небольшая частаная factory (можно вынести в отдельный класс PlanManager)
  5.    public static getById($id) {
  6.      // Формируем запрос в БД
  7.      $sql = "SELECT .... FROM plans JOIN options ON (....) ...."
  8.      $result = db::query($sql); // каким-то образом выгружаем из бд тариф и все его опции
  9.  
  10.      $Plan = new Plan($name, $cost, $....); // Cоздаем экземпляр модели
  11.      while(options)  { // проходим все вытаенные опции в цикле
  12.          $Option = new Option($name, $type, $...);
  13.          $Plan->addOption($Option); // Добавили в план опцию.
  14.       }
  15.      return $Plan;
  16.    }
  17.  
  18.    // Методы класса
  19.    protected $_options = array(); // массив для опций
  20.    public function __construct($name, $cost, $....) { .... }
  21.  
  22.    public function getOptions() {
  23.       return $this->_options;
  24.    }
  25.  
  26.    // остальная логика
  27. }
  28.  
  29. // Где-то в приложении
  30. $Plan = Plan::getById(10);
  31.  
  32. $options = $Plan->getOptions(); // Вернет массив объектов, хранящихся внутри плана
  33. foreach($options as $Option) {
  34.     $Option->..... ; // что-то делаем в цикле
  35. }
  36.  


Вроде бы все хорошо.. однако если надо сделать инстансы более сложных объектов, то на каждый случай приходится писать тонны SQL и во так инстанцировать все вложенные объекты.

Может быть есть подходящие методики проектирования или способы упростить / сделать правильно подобные вещи?

(Отредактировано автором: 04 Декабря, 2012 - 19:29:17)

 
 Top
caballero
Отправлено: 04 Декабря, 2012 - 19:44:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
В моем понимании модель - это какая-то сущность, представляющая одну таблицу в бд.

в нормальном понимании - это просто сущность (Entity)


Цитата:
Если придерживаться объектного подхода, то Объект класса Plan должен содержать в себе массив объектов класса Option из которых он состоит.

зачем все время держать там Option

сделай в Plan метод getOptions() и подтягивай когда оно понадобится


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
vladqa
Отправлено: 04 Декабря, 2012 - 19:49:17
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




caballero
Подтягивать можно, да
А если у меня есть массив объектов Plan ? И я буду в цикле проходить по ним и дергать getOptions. Тогда получится куча запросов к бд =(
 
 Top
caballero
Отправлено: 04 Декабря, 2012 - 20:18:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




так обычно и делается - называется "ленивой" загрузкой.

то что тебе понадобятся одновременно все вложеные данные маловероятно
лучше иногда сходить несколько раз к БД чем каждый раз грузить память гроздью ненужных объектов . Да и БД это напряжет в любом слууче- данные то надо выбрать по любому. Но лучше их выбирать когда они понадоьились а не выгребать каждый раз всю кучу


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bio man
Отправлено: 04 Декабря, 2012 - 20:28:02
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




vladqa пишет:
В моем понимании модель - это какая-то сущность, представляющая одну таблицу в бд.
Экземпляр класса этой модели, соответсвенно представляет конкретную строку таблицы.
Похоже на Active Record.
Что бы не нагружать память юзай DAO
 
 Top
vladqa
Отправлено: 04 Декабря, 2012 - 21:54:33
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Bio man, да, похоже!
Мне нравится этот подход, т.к. не нужно писать кучу одинакового sql-кода для рутины (тот же самый CRUD).

В данном случае проект не на Yii и использовать AR или DAO нет возможности =(

Про ленивую загрузку я знаю, конечно. В целом я понял, что такого готового паттерна нет и надо извращаться в зависимости от ситуации.

Хотя мне всегда казалось, что один запрос на выборку всех требуемых записей и их зависимостей будет много быстрее, чем череда таких же запросов для каждой конкретной записи, т.к. не тратится время на разбор SQL-запроса, соединение с БД и прочей сопутствующей ерундой. Про память я согласен.

Тогда вопрос такой: как же обычно вы инстанцируете свои модели, особенно если они не являются подобием Active Record? Так же пишете кучу sql-стейтментов? А если немного поменялась схема и нужно добавить поле/поля? Придется пробегаться по всем запросам =(

Извините заранее за глупые вопросы. Юзать по-полной ООП и в частности MVC начал недавно и пытаюсь наработать, что называется Best Practices

(Отредактировано автором: 04 Декабря, 2012 - 21:56:19)

 
 Top
caballero
Отправлено: 04 Декабря, 2012 - 22:08:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
В данном случае проект не на Yii и использовать AR или DAO нет возможности =(

это почему? самопальные модели можно а нормальные библиотеки нельзя

Цитата:
Хотя мне всегда казалось, что один запрос на выборку всех требуемых записей и их зависимостей будет много быстрее,

не будет, хотя бы потому что все равно не обойдетесь одним запросом

Цитата:
чем череда таких же запросов для каждой конкретной записи,

никакой череды не будет потому что вы получите только те данные с которыми работаете и это будет простой однотабличный запрос который в мускуле выполняется очень быстро

Цитата:
т.к. не тратится время на разбор SQL-запроса, соединение с БД и прочей сопутствующей ерундой.


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

Цитата:
Тогда вопрос такой: как же обычно вы инстанцируете свои модели, особенно если они не являются подобием Active Record?

они являются. Лично я использую ADODB там все есть для нормальной работы с БД.

Цитата:
Так же пишете кучу sql-стейтментов?

вставку и обновление может генерить ADODB по структуре таблицы и массиву данных которое ему скормили. сопоставляет поля по именам и генерит запрос. с выборкой еще проще select * from и все дела.

Поэтому в своей CMS я сделал для сущностей базовый клас Entity которому прописывается имя таблицы и имя ключевого поля. все простые операции типа засейвить себя в БД, он делает сам.



Цитата:
А если немного поменялась схема и нужно добавить поле/поля?

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB