Как нужно сохранять объекты в БД?

Вопросы, не относящиеся ни к одному разделу

Как нужно сохранять объекты в БД?

Сообщение guyasyou » 13 авг 2014, 21:17 ,  »  Сообщение:#1

Вот моя сохранялка
Код: Выделить всё
public function save() {
 
  
//Получаем массив колонок в БД
  $columns = $this->getColumns();
 
  $values 
= array();
  $fields = '';

  foreach ($columns as $column) {
    $fields .= '`'.$column.'`,';
    $vals .= '?,';
    $values[$column]= $this->$column;
  }

  //Обрезаем лишние запятые в концах строк
  $fields = substr($fields,0,-1);
  $vals = substr($vals,0,-1);
 
  $q 
= 'INSERT INTO `CRM_Organizations` ('.$fields.') VALUES ('.$vals.')';
  //Debug::dump($q);
  $db = Loader::db();
  $r = $db->execute($q, $values);
  if ($r) {
    
//Теперь мы знаем orgID и задаем объекту
    $this->orgID = $db->Insert_ID();
  }
}
 


Ужасно, да? :(
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как нужно сохранять объекты в БД?

Сообщение cmsservice » 24 авг 2014, 20:43 ,  »  Сообщение:#2

А ORM использовать не? Если уж так нужно мапить объекты на базу.
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Как нужно сохранять объекты в БД?

Сообщение guyasyou » 26 авг 2014, 11:33 ,  »  Сообщение:#3

Можно поподробней о ORM в с5. Есть пример какой?
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как нужно сохранять объекты в БД?

Сообщение cmsservice » 26 авг 2014, 11:49 ,  »  Сообщение:#4

В C5 нет (если не считать класс Model), а так есть интеграция Doctrine ORM
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Как нужно сохранять объекты в БД?

Сообщение guyasyou » 26 авг 2014, 22:40 ,  »  Сообщение:#5

Ммм, тоесть я могу наследовать Model и пользоваться его сохранялками? Попробую!
Спасибо!
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск

Re: Как нужно сохранять объекты в БД?

Сообщение cmsservice » 27 авг 2014, 09:59 ,  »  Сообщение:#6

Ну вообще Model это не полноценная ORM в современном понимании, а скорее некий уровень абстракции между объектами программы и БД.
Т.е., для примера, у нас есть в БД таблица crmCompany, содержащая поля: id, name, inn, kpp, address. В этом случае, чтобы не работать напрямую с БД через SQL, а оперировать объектом Company мы можем создать в директории models своего пакета файл company.php следующего содержания:
Код: Выделить всё
<?php defined('C5_EXECUTE') or die(_("Access Denied."));

/**
 * Company
 * Модель, описывающая компанию
 * @link http://peredelka-saitov.ru
 * @package CRM
 * @license 2014 Copyright by Переделка-сайтов.РФ
 *
 */
class Company extends Model {
  var $_table = 'crmCompany';
}

?>


Уже этот минимальный код позволяет работать с объектом таким образом:

- получение названия компании по ее id
Код: Выделить всё
<?php
Loader
::model('company', 'crm_pkg');
// получение компании из БД
$client = new Company();
$company->Load('id=1');
// печать названия компании на экран
echo $company->name;
?>


- изменение ИНН компании
Код: Выделить всё
<?php
Loader
::model('company', 'crm_pkg');
// получение компании из БД
$client = new Company();
$company->Load('id=1');
// присвоение нового ИНН
$comapny->inn = '1234567891';
$company->Save(); // сохранение в БД
?>


- создание новой компании
Код: Выделить всё
<?php
Loader
::model('company', 'crm_pkg');
// получение объекта компании
$client = new Company();
// присвоение данных новой компании
$comapny->name = 'OOO Рога и Копыта';
$comapny->inn = '1234567891';
$comapny->kpp = '1234567';
$comapny->address = 'г. Мухосранск, ул. Стандартная, д. 1';
// создание новой компании в БД
$company->Save(); 
?>


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

Кроме того, модели могут быть связанными, вложенными и много еще чего интересного можно наворотить, чтобы абстрагироваться от прямых запросов в БД. Все это доступно т.к. класс Model наследуется от класса ADOdb_Active_Record (ADOdb_Active_Record is an Object Relation Mapping (ORM) implementation using PHP.) и вся его функциональность доступна нам в работе.

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

Если есть вопросы, на которые смогу ответить, то готов помочь.
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Как нужно сохранять объекты в БД?

Сообщение guyasyou » 27 авг 2014, 15:07 ,  »  Сообщение:#7

С ORM у меня был опыт, просто в С5 не мог найти такого функционала, теперь нашел, работает нормально, мне этого функционала хватает.
Спасибо за подробный ответ!
www.pure-web.ru - fullstack разработка сайтов и веб-приложений
Аватара пользователя
guyasyou
Администратор
 
Сообщения: 559
Зарегистрирован: 05 янв 2012, 12:29
Откуда: Новосибирск


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron