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