Доступ к БД

Опубликовано Опубликовано в рубрике prestashop, Руководство разработчика PrestaShop, Русская документация PrestaShop 1.6

Доступ к БД

Доступ к БД

Структура БД

По умолчанию таблицы базы данных 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.