Доступ к БД
Доступ к БД
Структура БД
По умолчанию таблицы базы данных PrestaShop начинаются с префикса ps_.
Это можно настроить во время установки. Все имена таблиц указаны в нижнем регистре, а слова разделены символом подчеркивания («_»):
ps_employee
ps_manufacturer
ps_product
ps_product_comment
ps_shop_url
Когда таблица устанавливает связи между двумя объектами, имена обоих объектов упоминаются в имени таблицы. Например, ps_category_product
связывает товары с их категорией.
Несколько примечаний к таблицам:
- Таблицы, содержащие переводы, должны заканчиваться суффиксом _lang. Например, ps_product_lang содержит все переводы для таблицы ps_product.
- Таблицы, содержащие записи, относящиеся к конкретному магазину, должны заканчиваться суффиксом _shop. Например, ps_category_shop содержит позицию каждой категории в зависимости от магазина.
Существует также несколько стандартных методов для строк данных в таблице:
- Используйте поле id_lang для хранения языка, связанного с записью.
- Используйте поле id_shop для хранения хранилища, связанного с записью.
DBQuery класс
Класс DBQuery — это построитель запросов, который помогает создавать SQL-запросы. Например:
$sql = new DbQuery(); $sql->select( '*' ); $sql->from( 'cms' , 'c' ); $sql->innerJoin( 'cms_lang' , 'l' , 'c.id_cms = l.id_cms AND l.id_lang = ' .( int )$id_lang); $sql->where( 'c.active = 1' ); $sql->orderBy( 'position' ); return Db::getInstance()->executeS($sql); |
Вот некоторые из методов этого класса:
Метод и параметры
|
Описание
|
---|---|
__toString() | Generate and get the query. |
build() | Generate and get the query (return a string). |
from(string $table, mixed $alias = null) | Set table for FROM clause. |
groupBy(string $fields) | Add a GROUP BY restriction. |
having(string $restriction) | Add a restriction in the HAVING clause (each restriction will be separated by an AND statement). |
innerJoin(string $table, string $alias = null, string $on = null) | Add a INNER JOIN clause, E.g. $this->innerJoin(‘product p ON …’). |
join(string $join) | Add a JOIN clause, E.g. $this->join(‘RIGHT JOIN’._DB_PREFIX_.’product p ON …’);. |
leftJoin(string $table, string $alias = null, string $on = null) | Add a LEFT JOIN clause. |
leftOuterJoin(string $table, string $alias = null, string $on = null) | Add a LEFT OUTER JOIN clause. |
limit(string $limit, mixed $offset = 0) | Limit results in query. |
naturalJoin(string $table, string $alias = null) | Add a NATURAL JOIN clause. |
orderBy(string $fields) | Add an ORDER B restriction. |
select(string $fields) | Add fields in query selection. |
where(string $restriction) | Add a restriction in WHERE clause (each restriction will be separated by an AND statement). |
ObjectModel класс
Когда вам нужно глубоко погрузиться в БД, вам нужно использовать класс ObjectModel. Это основной объект объектной модели PrestaShop. Его нужно переопределить … с осторожностью.
Это вид Active Record класса (see: http://en.wikipedia.org/wiki/Active_record_pattern). Атрибуты таблицы или атрибуты представления базы данных PrestaShop инкапсулируются в этот класс. Следовательно, класс привязан к записи базы данных. После того, как объект был создан, в базу данных добавляется новая запись. Каждый объект извлекает свои данные из базы данных; Когда объект обновляется, также обновляется запись, к которой она привязана. Класс реализует средства доступа для каждого атрибута.
Определение модели
Для определения модели необходимо использовать статическую переменную $definition
. Например:
/** * Example from the CMS model (CMSCore) */ public static $definition = array( 'table' => 'cms' , 'primary' => 'id_cms' , 'multilang' => true , 'fields' => array( 'id_cms_category' => array( 'type' => self::TYPE_INT, 'validate' => 'isUnsignedInt' ), 'position' => array( 'type' => self::TYPE_INT), 'active' => array( 'type' => self::TYPE_BOOL), // Language fields 'meta_description' => array( 'type' => self::TYPE_STRING, 'lang' => true , 'validate' => 'isGenericName' , 'size' => 255 ), 'meta_keywords' => array( 'type' => self::TYPE_STRING, 'lang' => true , 'validate' => 'isGenericName' , 'size' => 255 ), 'meta_title' => array( 'type' => self::TYPE_STRING, 'lang' => true , 'validate' => 'isGenericName' , 'required' => true , 'size' => 128 ), 'link_rewrite' => array( 'type' => self::TYPE_STRING, 'lang' => true , 'validate' => 'isLinkRewrite' , 'required' => true , 'size' => 128 ), 'content' => array( 'type' => self::TYPE_HTML, 'lang' => true , 'validate' => 'isString' , 'size' => 3999999999999 ), ), ); |
Модель для многих магазинов и / или языков
Чтобы получить объект на многих языках:
'multilang' => true |
Чтобы получить объект в зависимости от текущего хранилища
'multishop' => true |
Чтобы получить объект, который зависит от текущего хранилища и на многих языках:
'multilang_shop' => true |
Основные методы
Любое переопределение методов ObjectModel неизбежно влияет на то, как действуют все другие классы и методы. Используйте с осторожностью.
Методы и параметры
|
Описание
|
---|---|
__construct($id = NULL, $id_lang = NULL) | Build object. |
add($autodate = true, $nullValues = false) | Save current object to database (add or update). |
associateTo(integer|array $id_shops) | Associate an item to its context. |
delete() | Delete current object from database. |
deleteImage(mixed $force_delete = false) | Delete images associated with the object. |
deleteSelection($selection) | Delete several objects from database. |
getFields() | Prepare fields for ObjectModel class (add, update). |
getValidationRules($className = _CLASS_) | Return object validation rules (field validity). |
save($nullValues = false, $autodate = true) | Save current object to database (add or update). |
toggleStatus() | Toggle object’s status in database. |
update($nullValues = false) | Update current object to database. |
validateFields($die = true, $errorReturn = false) | Check for field validity before database interaction. |