选择表单类型的数组到字符串转换错误
Posted
技术标签:
【中文标题】选择表单类型的数组到字符串转换错误【英文标题】:Array to string conversion error with choice form type 【发布时间】:2013-01-02 14:25:09 【问题描述】:我想要做什么:
我有一个带有“teams”表和“weekday”属性的数据库。我生成了我的学说实体,现在我正在构建一个 Symfony2 表单。
我想将一个包含工作日的数组保存到我的 teams 表中的 weekdays 属性中。 weekdays 属性是一个 VARCHAR(255) 所以它应该能够包含一个字符串数组。我使用选择类型,但在提交表单时出现数组到字符串的转换错误。
我在做什么:
我使用了 Symfony2 选择表单类型(带有多个选项),因为团队可以选择几个可用的工作日。我首先检索了我的团队对象数据。然后我制作这样的表格:
$builder = $this->createFormBuilder($team);
$form = $builder->add('weekday', 'choice', array(
'choices' => array(
'mon' => 'Monday',
'tue' => 'Tuesday',
'wed' => 'Wednesday',
'thu' => 'Thursday',
'fri' => 'Friday',
'sat' => 'Saturday',
'sun' => 'Sunday',
),
'multiple' => true,
'expanded' => true,
'label' => 'Day of the week',
'label_attr' => array('class' => 'control-label'),
'attr' => array('placeholder' => 'Day of the week', 'size' => '7')
))->getForm();
提交表单后,我使用实体管理器将更改保存到数据库:
if ($request->isMethod('POST'))
$form->bind($request);
if ($form->isValid())
// Save changes to db
$em = $this->getDoctrine()->getManager();
$em->persist($team);
$em->flush();
// Redirect to new canonical url
return $this->redirect($this->generateUrl('team_edit', array('nameCanonical' => $team->getNameCanonical(), 'code' => $team->getCode())));
错误:
在我看来,这一切都是 100% 有效的代码。我已经在 symfony2 中像这样制作了其他形式。但是当我在表单中选择一个或多个工作日,然后提交时,我得到了这个错误:
执行“UPDATE teams SET weekday = ? 哪里 id = ?带参数 "1":["mon","tue","wed"],"2":6:
注意:数组到字符串的转换 /Users/username/Dropbox/www/projectname/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php 第 1211 行
(Full error page here)
我想不出办法来解决这个问题。帮助表示赞赏! 我的完整代码可见on this gist。
【问题讨论】:
多选输入字段返回一个数组。在尝试将其作为字符串插入数据库之前,您需要对其进行按摩。 @phpisuber01 “按摩”是什么意思?自己将数组转换为字符串?我认为 Symfony2 和 Doctrine 应该处理这个......通常,我不必在提交后检索表单数据并在实体管理器保存之前对其进行更改 这取决于您希望如何保存数据? JSON,逗号分隔等?您的工作日字段是varchar()
,因此它只接受一个字符串。如果您将 Weekdays 设置为多对多关系的实体,Doctrine 会为您处理这个问题。但这可能是不必要的。
好吧,如果我查看上面的错误,我看到教义正在执行一个查询,他将工作日 VARCHAR 字段设置为["mon","tue","wed"]
。我以为 Doctrine 将 ["mon","tue","wed"]
视为字符串?我以为他会将这个值从字面上设置到工作日的 VARCHAR 中。但实际上,他可能会以多对多的关系正确处理它。我将尝试手动将其设为字符串数组(逗号分隔)。
【参考方案1】:
您需要做的是将您的属性类型设置为array
,Doctrine 会为您处理(反)序列化。
class Team
/**
* @ORM\Column(type="array")
*/
protected $weekdays;
/* Some more code */
所有可能类型的列表可以在官方documentation中找到。
【讨论】:
以上是关于选择表单类型的数组到字符串转换错误的主要内容,如果未能解决你的问题,请参考以下文章
数组到字符串转换错误,如何使用 laravel 存储表单中的数据