Magento UI组件多选框XML配置报错:数组转字符串转换求助
Alright, let's dig into this error and get it sorted out. That "Array to string conversion" notice in Zend/Db/Statement/Pdo.php line 228 is telling you one simple thing: your code is trying to shove an array value into a database field that expects a string/number, and Zend's PDO layer can't auto-convert that for you.
Looking at your code snippet for the website_id_2 field (using Magento\Store\Model\ResourceModel\Website\Collection as options), here's the most likely scenario and how to fix it:
Common Root Cause
If you set up the website_id_2 field as a multi-select for websites, the form will submit an array of website IDs. But if your database table's website_id_2 column is set to a single-value type (like INT or short VARCHAR), or your model isn't handling the array-to-string conversion, you'll hit this error.
Step-by-Step Fixes
1. Verify Your Database Column Type
First, check your brand table's website_id_2 column:
- If you need multi-select functionality, change the column type to
TEXTor a longVARCHAR(to store comma-separated IDs like1,3,5). - If it's supposed to be a single website selection, make sure the column is
INT(matches website ID type) and your form is set to single-select.
2. Add Array-to-String Conversion in Your Model
If you're using multi-select, update your brand model to handle the conversion before saving, and convert back after loading:
<?php namespace YourVendor\YourModule\Model; use Magento\Framework\Model\AbstractModel; class Brand extends AbstractModel { // ... existing code ... protected function _beforeSave() { parent::_beforeSave(); // Convert website ID array to comma-separated string $websiteIds = $this->getWebsiteId2(); if (is_array($websiteIds)) { $this->setWebsiteId2(implode(',', $websiteIds)); } return $this; } protected function _afterLoad() { parent::_afterLoad(); // Convert stored string back to array for frontend display $websiteIds = $this->getWebsiteId2(); if (!empty($websiteIds) && !is_array($websiteIds)) { $this->setWebsiteId2(explode(',', $websiteIds)); } return $this; } }
3. Check Your Form UI Configuration
If you intended website_id_2 to be a single-select field, make sure your XML configuration doesn't have multiple="true" enabled:
<field name="website_id_2"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Magento\Store\Model\ResourceModel\Website\Collection</item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> <item name="label" xsi:type="string" translate="true">Associated Website</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">website</item> <item name="sortOrder" xsi:type="number">30</item> <item name="dataScope" xsi:type="string">website_id_2</item> <!-- Ensure this line is NOT present: <item name="multiple" xsi:type="boolean">true</item> --> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">true</item> </item> </item> </argument> </field>
4. Debug to Confirm the Value Type
If you're still unsure, add a quick debug line right before saving to see what website_id_2 contains:
// In your save controller or model save method var_dump($brand->getWebsiteId2()); die;
This will show you if it's an array or a single value, helping you confirm which fix applies.
Final Note
This error almost always boils down to a mismatch between the data type your form is sending (array) and what your database/model expects (string/number). Once you align those two, the save should work without issues.
内容的提问来源于stack exchange,提问作者Andrey Rad

