Magento 2: Предварительная проблема с ключевыми ограничениями
Я пытаюсь сохранить записи с помощью контроллера. Я установил внешний ключ в поле attribute_set_id
и entity_type_id
в основной таблице с eav_attribute_set
и eav_entity_type
соответственно.
Но, когда я сохраняю записи, они не могут сохраняться.
Код контроллера :
<?php
namespace VendorName\ModuleName\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
protected $moduleNameFactory;
protected $_dateFactory;
/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory resultPageFactory
* @param \VendorName\ModuleName\Model\ModuleNameFactory $moduleNameFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory,
\VendorName\ModuleName\Model\ModuleNameFactory $moduleNameFactory,
\Magento\Framework\Stdlib\DateTime\DateTimeFactory $dateFactory
)
{
$this->resultPageFactory = $resultPageFactory;
$this->moduleNameFactory = $moduleNameFactory;
$this->_dateFactory = $dateFactory;
parent::__construct($context);
}
/**
* @return void
*/
public function execute()
{
$module = $this->moduleNameFactory->create();
$module->setEntityTypeId(15); // this value can't saved in main table
$module->setAttributeSetId(22); // this value can't saved in main table
$module->setTitle('Title');
$module->setUrl('url');
$module->setDesc('desc');
$module->setStatus(1);
$module->setCreatedAt($this->_dateFactory->create()->date());
$module->setUpdatedAt($this->_dateFactory->create()->date());
$module->save();
}
}
?>
InstallSchema.php :(код entity_type_id и код attribute_set_id)
$table->addColumn(
'entity_type_id',
Table::TYPE_SMALLINT,
null,
[
'unsigned' => true,
'nullable' => false,
'default' => '0',
],
'Entity Type ID'
)->addIndex(
$setup->getIdxName($tableName, ['entity_type_id']),
['entity_type_id']
)->addForeignKey(
$setup->getFkName(
'vendorname_modulename_entity',
'entity_type_id',
'eav_entity_type',
'entity_type_id'
),
'entity_type_id',
$setup->getTable('eav_entity_type'),
'entity_type_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
);
$table->addColumn(
'attribute_set_id',
Table::TYPE_SMALLINT,
null,
[
'unsigned' => true,
'nullable' => false,
'default' => '0',
],
'Attribute Set ID'
)->addIndex(
$setup->getIdxName($tableName, ['attribute_set_id']),
['attribute_set_id']
)->addForeignKey(
$setup->getFkName(
'vendorname_modulename_entity',
'attribute_set_id',
'eav_attribute_set',
'attribute_set_id'
),
'attribute_set_id',
$setup->getTable('eav_attribute_set'),
'attribute_set_id',
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
\Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
);
Он возвращает ошибку при сохранении:
Нарушение ограничения целостности: 1452 Не может добавить или обновить дочерний элемент строка: ограничение внешнего ключа не выполняется (
m226
.vendorname_modulename_entity
, ОГРАНИЧЕНИЕFK_5F02A602AEE613FE515E787AA9C5EB1F
ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ (entity_type_id
)eav_entity_type
(entity_type_id
) ПРИ УДАЛЕНИИ КАСКАДА), запрос был: ВСТАВИТЬ Вvendorname_modulename_entity
(created_at
,updated_at
) ЦЕННОСТИ ('2019-03-01 06:04:57', '2019-03-01 06:04:57')"
Если я установил значение по умолчанию null в обоих полях, то ошибка не возвращается, но поле всегда устанавливает нулевое значение.
Как это решить?
Любая помощь будет оценена.
1 answers
Как мы видим в сообщении об ошибке, вставка неверна, так как в инструкции всего два столбца, и это явно неправильно: INSERT INTO vendorname_modulename_entity (created_at, updated_at) VALUES ('2019-03-01 06:04:57', '2019-03-01 06:04:57')
.
Проблема может быть в вашей модели или модели ресурсов:
Вы определили метод setEntityTypeId
в своей модели, который задает идентификатор сущности или идентификатор типа в модели ресурсов?
Если нет, ваш метод не может сделать то, что вы ожидаете. Самый простой способ imho - установить тип сущности непосредственно в вашей модели ресурсов, поскольку он фиксирован. Таким образом, вам не нужно устанавливать это для каждой сущности.
Добавьте такую функцию в свою модель ресурсов:
public function getEntityType() {
if(empty($this->_type)) {
$this->setType('your_entity_type_code_here');
}
return parent::getEntityType();
}
После совместной отладки кода в чате решение состояло в том, чтобы построить модель ресурсов только с помощью описанного выше метода и _getDefaultAttributes()
следующим образом:
protected function _getDefaultAttributes()
{
return ['entity_type_id', 'attribute_set_id', 'created_at', 'updated_at'];
}