Symfony一个实体加入了许多实体

时间:2016-10-16 09:30:18

标签: symfony orm entity

我有一个用户实体加入其他实体,如Runner,篮球运动员,足球运动员......)。每个运动员都有spécifications字段,所以我创建了加入Runner实体,篮球实体,足球实体的用户实体。这些运动加入了用户实体,但是这个解决方案是不可靠的,因为管理员必须添加具有spécifications字段的新Athletic类型,也不适合要求开发者为每个新的Athletic类型创建新实体我认为首先将json数据字段添加到用户实体,但管理员如何指定新字段的类型,我可以在表单上实现这种类型的json字段。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我希望这会对你有所帮助。

如果我理解您所写的内容,我认为您只需要向用户实体添加一个属性即可。用户实体可以是足球运动员或跑步者等。 所以只需将sportType属性添加到您的用户实体。

如果用户可能有多个sportType,那么您可以在数据库中使用3个表: 1个表叫做user 1表称为体育 1个名为user_sports的表

表用户

ID Name   email          ...
1  Name1  bob@gmail.com  ...
2  Name2  foo@gmail.com  ...
3  Name3  bar@gmail.com  ...

表运动

ID Name
1  football
2  basketball
3  running

表user_sport

ID user_id sport_id
1  1        3
2  8        1
3  1        2
.. ..       ..

因为一个用户可能有很多运动,所以它是一个对多的运动员#34;关系。您可以在Doctrine documentation上看到如何在您的实体上设置此类关系。

更新: 如果我了解您的管理员会向体育实体添加字段,而您不知道体育实体将拥有多少字段。

您可以使用Data Transformers组件。看看这里: http://symfony.com/doc/current/form/data_transformers.html

当您构建表单以让管理员添加新的Sport实体时,您可以为其提供TextAreaType。管理员将手动将有效的json添加到此TextAreaField

当管理员将表单发送到您的控制器时,它将根据您在SportType中定义的方式转换TextAreaType。

例:

// src/AppBundle/Form/SportType.php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;

// ...

class SportType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('sportJsonFields', TextAreaType::class); //here you give the texterea to your admin so he inserts a json manually

        $builder->get('sportJsonFields') 
            ->addModelTransformer(new CallbackTransformer(
                function ($SportJsonFieldsJson) {
                    // transform the json datas to a string
                    return json_decode($tagsAsArray);
                },
                function ($tagsAsString) {
                    // transform the string back to a valid json
                    return json_encode($SportJsonFieldsTextArea);
                }
            ))
        ;
    }

}