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 должны быть автономными сущностями.
Управление этой таблицей может быть сделано:
- В вашей модели ObjectAttachment OrderAttachment (если у вас есть)
- Withing Product ObjectModel (использование переопределений, добавление необходимых методов)
- Вы можете иметь класс ProductOrderAttachment (не ObjectModel) и там иметь статические методы.
Тем не менее, если у вас есть сущность OrderAttachment, 1) - лучший подход. Если у вас его нет, вы можете добавить его, так как он выглядит как "автономная сущность".