保存到数据库之前转换数据

时间:2014-04-15 15:07:32

标签: symfony

刚刚开始使用Symfony,所以请在这里忍受。

我有一个带有字段的实体" myField"它作为ENUM存储在数据库中,其值为' Y'或者' N' (这是我正在使用的旧数据库架构,并尝试将symfony用作应用程序来处理数据)

我想代表" myField"带有打开或关闭的复选框(0或1)。保存表单后,如何将值转换为适当的“Y'或者' N'在将其持久保存到数据库之前的值?

我查看了Data Transformers,这可能是我需要去的地方,但是创建一个新的类和文件来转换这些数据似乎很愚蠢。这是一个非常简单的转变。

也许我会改变实体上的setMyField($myField) () {} setter方法来转换那里的数据?同样,将其转换回getMyField() {}?但是,Doctrine还没有使用setter方法吗?如果是这样,那么当Doctrine设置一个值时,它将是数据库中的正确值(0或1),并且不需要转换。但是如果表单设置了值,则需要进行转换。

这是行动代码:

public function newAction(Request $request)
{
    $course = new Course();

    $form = $this->createForm(new CourseForm(), $course);

    $form->handleRequest($request);
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($course);
        $em->flush();

        return $this->redirect($this->generateUrl('courses'));
    }

    return $this->render('PucsTestBundle:Course:new.html.twig', array(
        'form' => $form->createView(),
    ));
}

我想我可以在调用handleRequest之前在控制器中自行转换数据,但这可能不是很好的做法。

此外,我在数据库中有一个字段" days"这只是一个VARCHAR,就像周一,周二周三的MTW一样。我想为所有这些值提供一个复选框,然后对表单提交进行后处理,以将数据转换为适当的单个值。

2 个答案:

答案 0 :(得分:1)

您应该使用定义的here in the documentation

自定义Doctrine类型
<?php
namespace My\Project\Types;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

/**
 * My custom datatype.
 */
class OldBooleanType extends Type
{
    const NAME = 'OldBoolean'; // modify to match your type name

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return 'OldBoolean';
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        if ($value === 'Y'){
          return true;
        }
        if ($value === 'N'){
          return false;
        }
        return null;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if ($value === true){
          return 'Y';
        }
        if ($value === false){
          return 'N';
        }
        return null;
    }

    public function getName()
    {
        return self::NAME;
    }
}

答案 1 :(得分:-1)

来自Symfony文档:http://symfony.com/doc/current/cookbook/form/data_transformers.html

  

数据转换器用于将字段的数据转换为可以在表单中显示的格式(并在提交时返回)。

相关问题