Prestashop: как определить несколько первичных ключей с помощью ObjectModel

Я определяю новые сущности, расширяющие ObjectModel. У меня есть таблица с 2 первичными ключами, как это:

CREATE TABLE `ec_product_order_attachment` (
  `id_product` int(10) unsigned NOT NULL,
  `id_order_attachment` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id_product`,`id_order_attachment`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Кажется, однако, я не могу определить таблицу с 2 первичными ключами в ObjectModel.

Вы знаете какой-нибудь способ сделать это?

ОБНОВЛЕНИЕ (решено)

Пользователь PrestaShop-Developer.com дал мне хорошее предложение. Я переработал пользовательский класс сущности Order_Attachment, и он работает просто отлично. Так что просто для документирования я копирую и вставляю законченный класс. Проще говоря, я создал этот класс для пользовательского модуля, который добавляет вкладку на страницу продукта для редактирования администратором, чтобы добавить возможность сохранять специальные вложения, которые будут отправлены вместе с заказанным письмом. Поэтому мне понадобились две новые таблицы: order_attachment и product_order_attachment, чтобы связать продукты со специальными order_attachments.

class Order_Attachment extends ObjectModel{
    public $name;
    public $mime;
    public $attachment_type;
    public $id_order_attachment;

    //validation options are from Prestashop's Validate class
    public static $definition = array(
        'table' => 'order_attachment',
        'primary' => 'id_order_attachment',
        'multilang' => FALSE,
        'fields' => array(
            'name' => array('type' => self::TYPE_STRING, 'size' => 128),
            'mime' => array('type' => self::TYPE_STRING, 'size' => 128),
            'attachment_type' =>  array('type' => self::TYPE_STRING, 'size' => 128)
        )
    );

    //get current order attachments for a specific product
    public static function get_product_order_attachments($id_product = false){

        $id_p = ($id_product) ? $id_product : Tools::getValue('id_product');

        $db = Db::getInstance();
        $sql = 'SELECT *
                FROM ' . _DB_PREFIX_ . 'order_attachment oa
                INNER JOIN ' . _DB_PREFIX_ . 'product_order_attachment poa ON oa.id_order_attachment = poa.id_order_attachment
                WHERE poa.id_product = ' . $id_p;
        return $db->executeS($sql);
    }

    public function save($null_values = false, $autodate = true){

        $result1 = parent::save();

        $result2 = Db::getInstance()->insert('product_order_attachment',array(
            'id_product' => Tools::getValue('id_product'),
            'id_order_attachment' => $this->id
        ));

        return ($result1 && $result2);
    }

    public function delete($id_product = false){

        $id_p = ($id_product) ? $id_product : Tools::getValue('id_product');

        //destroy file associated with the attachment
        if(file_exists(_PS_UPLOAD_DIR_ . $this->name)) unlink(_PS_UPLOAD_DIR_ . $this->name);

        parent::delete();
        Db::getInstance()->delete('product_order_attachment','id_product = ' . $id_p . ' AND id_order_attachment = ' . $this->id);
    }

}//END CLASS

1 ответ

Решение

Нет способа определить ключ из нескольких столбцов в объектной модели PrestaShop. Это неправильно по определению. Ваши ObjectModels должны быть автономными сущностями.

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

  1. В вашей модели ObjectAttachment OrderAttachment (если у вас есть)
  2. Withing Product ObjectModel (использование переопределений, добавление необходимых методов)
  3. Вы можете иметь класс ProductOrderAttachment (не ObjectModel) и там иметь статические методы.

Тем не менее, если у вас есть сущность OrderAttachment, 1) - лучший подход. Если у вас его нет, вы можете добавить его, так как он выглядит как "автономная сущность".

Другие вопросы по тегам