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'];
}
 2
Author: HelgeB, 2019-03-01 11:24:00