Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

ORM в OpenCart


Recommended Posts

crystal.martinrusev.net - отличный инструмент для работы с базой данных. Конечно, для монстров-магазинов он не годится, но для небольших сайтов - самое то. Тем более, очень часто, скорость разработки важнее. Статья, как подключить crystal
Надіслати
Поділитися на інших сайтах


По большому счету Crystal ничего не даёт, только синтаксис другой...

$information = $this->crystal->get(DB_PREFIX.'information_description')
                               ->where(array('information_id' => 1, 'language_id' => 1))
                               ->fetch_row();
и

"SELECT * FROM ".DB_PREFIX."information_description WHERE information_id = 1 AND language_id = 1"
особой разницы в скорости разработки не вижу (Crystal только экранирует сам), а по скорости работы - Crystal проиграет, потому что ему надо собирать SQL-запрос.

Валидация которая есть в Crystal не принципиальна, multiple - тоже не нужен, а когда начнёш собирать трёхэтажные джойны - запаришся обдумывать как он соберёт запрос и думаю без вставок raw'ом не обойдёшся...

Поделись соображениями в каком месте жизнь облегчается...

Надіслати
Поділитися на інших сайтах

Все таки

$this->db->query("INSERT INTO " . DB_PREFIX . "customer SET store_id = '" 
. (int)$this->config->get('config_store_id') . "', firstname = '" 
. $this->db->escape($data['firstname']) . "', lastname = '" 
. $this->db->escape($data['lastname']) . "', email = '" 
. $this->db->escape($data['email']) . "', telephone = '" 
. $this->db->escape($data['telephone']) . "', fax = '" 
. $this->db->escape($data['fax']) . "', password = '" 
. $this->db->escape(md5($data['password'])) . "', newsletter = '" 
. (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) 
. "', customer_group_id = '" . (int)$this->config->get('config_customer_group_id') 
. "', status = '1', date_added = NOW()");
Выглядит не так красиво как

$data['store_id'] = (int)$this->config->get('config_store_id');
$data['customer_group_id'] = $this->config->get('config_customer_group_id');
$data['status'] = 1;
$data['date_added'] = NOW();
$data['password'] = md5($data['password']);

$this->crystal->insert(DB_PREFIX."customer", $data)->execute();
Хотя, конечно, кому как удобней.
Надіслати
Поділитися на інших сайтах


Все таки давай по честному...

Куда делось

$data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0);
и вот это

$data['date_added'] = NOW();
скорее всего не пройдёт, потому что думаю получиш

date_added = 'NOW()'
и тут надо будет raw'ом изголяться, с лёту даже не соображу как именно... и уже не так красиво получается.

Да и пример ты взял который выгоден тебе, с готовым массивом данных.

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

Надіслати
Поділитися на інших сайтах

А если вот так сравнить?

$data['store_id'] = (int)$this->config->get('config_store_id');
$data['customer_group_id'] = $this->config->get('config_customer_group_id');
$data['status'] = 1;
$data['date_added'] = NOW();
$data['password'] = md5($data['password']);
$data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0);

$this->crystal->insert(DB_PREFIX."customer", $data)->execute();
и

$data['store_id'] = (int)$this->config->get('config_store_id');
$data['customer_group_id'] = $this->config->get('config_customer_group_id');
$data['status'] = 1;
$data['date_added'] = NOW();
$data['password'] = md5($data['password']);
$data['newsletter'] = (isset($data['newsletter']) ? (int)$data['newsletter'] : 0);
$data = array_map(array($this->db, 'escape'), $data);

$this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")");
как бы и разницы уже почти нет...
Надіслати
Поділитися на інших сайтах

$this->db->query("INSERT INTO ".DB_PREFIX."customer (".implode(',', array_keys($data)).") VALUES (".implode(',', $data).")");
В crystal, по сути, это и реализовано в insert() только в более удобной форме. Так почему бы не пользоваться наряду с чистым sql?
Надіслати
Поділитися на інших сайтах


Лично мне намного приятнее видеть вот такой запрос

$this->db->query("INSERT INTO " . DB_PREFIX . "customer SET 
	store_id          = '" . (int)$this->config->get('config_store_id') . "', 
	firstname         = '" . $this->db->escape($data['firstname']) . "', 
	lastname          = '" . $this->db->escape($data['lastname']) . "', 
	email             = '" . $this->db->escape($data['email']) . "', 
	telephone         = '" . $this->db->escape($data['telephone']) . "', 
	fax               = '" . $this->db->escape($data['fax']) . "', 
	password          = '" . $this->db->escape(md5($data['password'])) . "', 
	newsletter        = '" . (isset($data['newsletter']) ? (int)$data['newsletter'] : 0) . "', 
	customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "', 
	status            = '1', 
	date_added        = NOW()");
Посмотрел и сразу всё понятно, всё под контролем, не надо лазить по коду и выяснять что там в этой $data, не попало ли туда что-то лишнее.

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

  • +1 1
Надіслати
Поділитися на інших сайтах

По хорошему в Кристале надо перед выполнением запроса вот такое добавлять

$allowed = array(store_id,
	firstname,
	lastname,
	email,
	telephone,
	fax,
	password,
	newsletter,
	customer_group_id,
	status, 
	date_added);

$data = array_intersect_key($data, array_flip($allowed));
Это немного добавит наглядности запросу, и защитит от "подарков" со стороны верстальщика :)
Надіслати
Поділитися на інших сайтах

Это верно. Но, по хорошему, в форме не должно быть никаких подарков от верстальщиков, а формироваться формы должны в зависимости от моделей/таблиц(как во всех нормальных фреймворках). И лучше всего - делать валидацию перед записью в бд

Надіслати
Поділитися на інших сайтах


Даже без "подарков" от верстальщика, частенько из одной формы надо раскинуть данные по разным таблицам.

Для этого, кстати, есть отличное решение: имена типа name="Blog[title]", name="Blog[body]", name="User[name]", name="User". Тогда данные будут храниться в разных массивах.
$this->request->post['Blog']
и
$this->request->post['User']
. Посмотрите, как работает Yii или CakePHP. Там все именно по такому принципу.
Надіслати
Поділитися на інших сайтах


Даёш руку на отсечение что при работе с $this->request->post['Blog'] не понадобятся данные из $this->request->post['User']?

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

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

Микроскопом можно забить гвоздь, но не нужно... для этого есть молоток. И если у тебя в багажнике лежит молоток - совсем не обязательно ложить туда второй только потому что у него ручка красивее. Если есть четкое обоснование того что надо два молотка - тогда без проблем... А я пока не услышал ничего кроме "код красивее".

Если нет четкого ответа на вопрос - ничего страшного и не надо искать оправданий. Ну нравится тебе Кристал и ладно...

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

По большому счету - старый, добрый, DbSimple Димы Котерова гораздо интереснее чем Crystal, как минимум за счет наличия плейсхолдеров, макроподстановок и более интересных вариантов выборки данных.

Надіслати
Поділитися на інших сайтах

  • 3 weeks later...

ORM как правило выручает в больших проектах с задействованием спецов разного профиля.

Лично мне нравятся проекты, использующие инкапсуляцию. А то, что парадигме OpenCart до этого далеко - это другой разговор. За статью спасибо ;)

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.