Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модель в php 
:(
    Опции темы
Shklyar
Дата 20.8.2013, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Вот какой вопрос: пользую фреймворк, неважно какой, есть понятие модель.
В классике, модель это сущности: статья, пользователь.
Другой подход - модель-страница, т.е. класс модели отвечает за работу с данными страниц одного типа: страницы статьей, страницы статьи, страницы пользователя...
В чем разница? При первом подходе более четкая структура, при втором - вроде оптимальнее при работе с БД. Т.е., при первом подходе, чтоб показать страницу с 10 статьями нужно сделать 10 селектов статьей и 10 селектов пользователей и что-то еще. При втором подходе - можно сделать один сложный селект только коротких текстов статьей и пользователей. Однако, предполагаю, что если настроить кеширование работы с БД, то можно, даже, получить более низкую нагрузку!?
Скажите свои мысли, плиз.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Fortop
Дата 20.8.2013, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Shklyar @  20.8.2013,  00:00 Найти цитируемый пост)
при первом подходе, чтоб показать страницу с 10 статьями нужно сделать 10 селектов статьей и 10 селектов пользователей и что-то еще

С каких дел?

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

Это сообщение отредактировал(а) Fortop - 20.8.2013, 02:06


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 20.8.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Модель - это не столько один или несколько классов, а язык, с помощью слов которого контроллер и view запрашивают данные. Нужно сначала определить слова и фразы этого языка, а потом планировать реализацию модели.

Вообразим типичную, imho, MVC схему. Контроллер выясняет хотелки пользователя и определяет пару "модель"-"view", которая по, мнению контроллера, подходит. Затем обращается к модели со словами "дай данные с такими-то параметрами". Это - одна фраза языка.  В ответ на эту фразу модель может уточнить тип и параметры view и вернёт "данные" - себя самого. (Случай, когда данные возвращаются в виде массива представляется слишком тривиальным и жестким  smile )  Удобно делать фразу "дай данные" - конструктором модели, таким образом остальные фразы языка - методы и атрибуты "модели".
На этом этапе совсем не обязательно уже иметь готовые данные запроса. Хотя понять есть данные или нет, чтобы вывести в нужном случае 404 страничку - бывает полезно.

Дальше - фразы "модельного языка" начинает употреблять view. Нужно просто посмотреть на его потребности и тупо переписать их в методы.
Что-то типа "дай мне структуру главного меню", "дай мне структуру breadcrumbs", "дай мне массив данных для вывода". Сама фраза "дай мне массив данных", произнесенная view может содержать уточнения - "дай мне 10 записей, совместно с данными о пользователях". Вот в этот момент и нужно выбрать наиболее подходящий запрос к базе, чтобы он был максимально эффективным. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shklyar
Дата 22.8.2013, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Цитата(Fortop @ 20.8.2013,  02:06)
Никто не мешает выбрать всех пользователей и статьи одним-двумя запросами и создать нужное количество объектов.

Предполагаю, что классы для создания нужного кол-ва объектов, находятся в модели (статья, пользователь...). А где находится класс, который знает про пользователей, статьи и другие сущности, который может одим-двумя запросами (знает как составить и сопоставить эти запросы) собрать всю нужную инфу?

Цитата(ksnk @ 20.8.2013,  09:06)
Модель - это не столько один или несколько классов, а язык, с помощью слов которого контроллер и view запрашивают данные. Нужно сначала определить слова и фразы этого языка, а потом планировать реализацию модели.
...
Контроллер ... Затем обращается к модели со словами "дай данные с такими-то параметрами". Это - одна фраза языка.

Но, ведь круче попросить, например, статью. А статья, имея поле автор, сама подтянет пользователя-автора.
Т.е. просить не данные, а какой-то объект, выходит. А объект статья, ведь, не обязан знать телефон пользователя?  Телефон должен знать объект пользователь. Но статья содержит в себе пользователя с инкапсулированным в нем телефоном. Как-же обойтись одним запросом?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Sanchezzz
Дата 22.8.2013, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



я кажется понял куда клонит ТС, на AR модели? если да то там определяются связи для получения данных из других моделей, как правило по составному PK


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 22.8.2013, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Ok! Объект Статья.
В контроллер приходит строка article=XXX. Контроллер запрашивает объект new Article(array('ID'=>'XXX'));

Шаблон sql запроса - `select %fields% from %tables%[ where %where%][ order %order%]`
В статье по умолчанию имеются такие заполнители для него: 
Код

array('fields'=>array('a.id','a.text','a.author_id','a.date'),'table'=>'my_articles as a', 'link'=>array('my_users'=>'a.author_id=u.id ' ))
  

Вьюшка может предварительно "приготовить" объект Article, запросив дополнительные поля. Наприемер информация об авторе
- класс User с базовой таблицей my_user, с полями
Код

array('fields'=>array('u.id','u.name','u.email'),'table'=>'my_users as u'). 
  
В поле link написано, что таблицы my_articles  и my_users  связаны по полю a.author_id и u.id, так вот получается комплексный запрос
Код

select `a.id`,`a.text`,`a.author_id`,`a.date`,`u.id`,`u.name`,`u.email`  from my_articles as a left join my_users as u on a.author_id= u.id  where a.id=XXX

Итого - одним запросом вытаскиваем все нужные данные.

Но можно, конечно, не выпендриваться и тягать данные запросами как только они понадобятся для вывода данных.

Это сообщение отредактировал(а) ksnk - 22.8.2013, 21:28


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shklyar
Дата 23.8.2013, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Active Record? Не знаю. Какое количество запросов предполагает AR в примере статьи и автора?

ksnk, выходит вытаскиваем. Признаться, не все представил, но как бы да. Вы могли бы собрать этот пример полностью, архивом, чтоб можно было поиграться и все понять, плиз. Еще вопрос о влиянии вью на модель. Зачем?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
ksnk
Дата 23.8.2013, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Shklyar @  23.8.2013,  00:08 Найти цитируемый пост)
Active Record? Не знаю. Какое количество запросов предполагает AR в примере статьи и автора?

Если завязываться на какой-то AR, придется тянуть за собой целый фреймворк, так как Active Record никогда не ходит один . В принципе - это не так и плохо... К примеру реализация AR от Yii достаточно прилична. Отчего бы не продать душу Yii?  smile 

Цитата(Shklyar @  23.8.2013,  00:08 Найти цитируемый пост)
пример полностью, архивом, чтоб можно было поиграться и все понять, плиз
 От объяснения на пальцах, как мог бы работать конструктор запросов, до реально работающего кода довольно далеко. Да и задача такая передо мной пока не стоит.

Цитата(Shklyar @  23.8.2013,  00:08 Найти цитируемый пост)
Еще вопрос о влиянии вью на модель. Зачем? 

Если вью не влияет на модель, то модель выдает только фиксированные данные - строки таблицы по индексам. То есть все отображаемые вьюшкой данные вытаскиваются большим количеством запросов. В то же время, можно вручную состряпать sql, который все эти данные выведет одним запросом. Чтобы модель могла сама построить такое - на нее нужно уметь влиять, объясняя ей, что количество данных - не более 20 (к примеру) строк, что нужны такие-то поля таких-то таблиц... Для других условий запрос может понадобится другой. Запрос, опять же, можно мастерить каждый раз заново, а можно выбирать наиболее подходящий к заказанным условиям из набора написанных вручную, то есть Active Record, как бы, не всегда и нужен.

Цитата(Shklyar @  20.8.2013,  00:00 Найти цитируемый пост)
Скажите свои мысли, плиз.

Дык.  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 23.8.2013, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Shklyar @  22.8.2013,  20:28 Найти цитируемый пост)
Предполагаю, что классы для создания нужного кол-ва объектов, находятся в модели (статья, пользователь...). А где находится класс, который знает про пользователей, статьи и другие сущности, который может одим-двумя запросами (знает как составить и сопоставить эти запросы) собрать всю нужную инфу?


Почитайте о Data Mapping
Он отвечает за перевод данных в объектную форму. Соответственно ему и знать как данные в таблицах между собой связаны.
Например
http://www.martinfowler.com/eaaCatalog/dataMapper.html
http://www.martinfowler.com/eaaCatalog/dependentMapping.html
http://www.martinfowler.com/eaaCatalog/activeRecord.html

Добавлено через 3 минуты и 23 секунды
Цитата(Shklyar @  23.8.2013,  00:08 Найти цитируемый пост)
Еще вопрос о влиянии вью на модель. Зачем? 

Какое влияние?

То, что вью захотело получить не все данные, а только их часть?
Так гибче.

Но никто не мешает в модели создать соответствующие методы

getDataColumns123()
getDataColumns134()
getDataColumnsVasyaPetjaFedja()

И уже в них задавать список дополнительных полей


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
georgiy11
Дата 23.8.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 29.9.2008

Репутация: нет
Всего: нет



Fortop, 
Цитата

Но никто не мешает в модели создать соответствующие методы

getDataColumns123()
getDataColumns134()
getDataColumnsVasyaPetjaFedja()

И уже в них задавать список дополнительных полей 


Реально качественный совет. 
Многие, типа топик стартера не до конца осознав что нужно, делают формирование частей запроса (например where, join) в контроллере или чего хуже во вьюхе, руководствуясь тем что можно из вне легко ограничить условия и набор. 
Это потом получается катастрофа, особенно если используется во многих частях программы. 
PM MAIL   Вверх
Shklyar
Дата 23.8.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Да, про Data Mapping вижу надобность прочесть.

Цитата(georgiy11 @ 23.8.2013,  10:54)
Многие, типа топик стартера не до конца осознав что нужно, делают формирование частей запроса (например where, join) в контроллере или чего хуже во вьюхе, руководствуясь тем что можно из вне легко ограничить условия и набор. 
Это потом получается катастрофа, особенно если используется во многих частях программы.

 smile Вам что-то известно о ТС?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
ksnk
Дата 23.8.2013, 11:49 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Shklyar @  23.8.2013,  11:18 Найти цитируемый пост)
Вам что-то известно о ТС? 

Возможно, это ко мне  smile 

georgiy11, Можно чуть поподробнее про катастрофы? А то звучит , imho, неубедительно. Те же Active record строят запросы на лету и в массовом порядке, вроде, не самоубиваются...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
georgiy11
Дата 23.8.2013, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 29.9.2008

Репутация: нет
Всего: нет



ksnk, 
Цитата

Те же Active record строят запросы на лету и в массовом порядке


Нет, в одной модели AR это нормально и правильно.
Сложности начинаются когда в дестках контроллеров/сущностях/стратегиях используются формирования where наподобие 'field=value AND ....' .
Так вот, когда происходит рефакторинг таблиц или запросов оптимизация, или же банальные изменения свойств к таблице, например поле удаляется, переименовывается: все вхождения поля придётся по всей системе вычислять и это благо если они явно и статично указаны именем как `field` `email` ... , например.
Ещё сложнее происходит, когда имя поля в составе массива приходит с клиента(js/html), например как имя поля формы(имя свойства json данных), и опять приходится отыскивать баг.
То есть, чем меньше знают контроллеры/сущности/стратегии о названиях полей, которые непременно будут фигурировать в составлении запроса, тем локализованей поиск ошибок и легче рефакторинг.
Если все поля в пределах модели AR будут формироваться, не важно как динамически не динамически, и если о всех названиях полей будет знать только модель AR, как отображение таблицы, тем конечно же проще. 

Это сообщение отредактировал(а) georgiy11 - 23.8.2013, 17:14
PM MAIL   Вверх
ksnk
Дата 23.8.2013, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



georgiy11, Ну, это проблема API Active record, а не подхода. Если все "уточнения" идут через api, то никаких особенных глюков и граблей быть не должно. А строить один запрос из нескольких разных мест - это, конечно, грабли.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
georgiy11
Дата 23.8.2013, 20:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 29.9.2008

Репутация: нет
Всего: нет



Просто предостеречь так сказать ТС (если обидил чем то извиняюсь smile), есть соблазн крутить её же полями (модели) из других слоёв.

Это сообщение отредактировал(а) georgiy11 - 23.8.2013, 20:24
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.