(奏鸣曲)如果没有 Admin 链接就不可能创建 OneToOne 关系
(Sonata) Impossible to create a OneToOne relation without having an Admin linked to it
我想围绕 Sonata 创建我的应用程序,但我遇到了一些问题...
我扩展了 BaseUser 来创建我自己的用户,我也为 UserAdmin 做了同样的事情。
我创建了另一个实体,用户在该实体上具有 OneToOne 关系,但我不希望该实体可由具有链接到该实体的管理员的用户管理。
我希望用户填写这些实体的唯一方法是通过 UserAdmin,我试过这样的方法:
protected function configureFormFields(FormMapper $formMapper){
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("test", EntityType::class, array(
"class" => "AppBundle:PersonDetails",
"property_path" => "details.test"
))
->end()
->end();
}
这是我的用户 class :
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails")
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
public function __construct()
{
parent::__construct();
$this->details = new PersonDetails();
}
/**
* @return PersonDetails
*/
public function getDetails()
{
return $this->details;
}
/**
* @param PersonDetails $details
*/
public function setDetails($details)
{
$this->details = $details;
}
}
我得到的唯一东西是 select,它要我选择现有的 PersonDetails(我想)。
我怎样才能做到这一点?而且,如果它很容易实现,为什么它没有出现在文档中?我觉得这种情况并不少见..
感谢您的帮助
Sonata 将尝试解析传递给 add("test")
的字符串,因此我们可以通过一个简单的 add("details.test")
访问我们的实体 不受任何 Sonata 管理 驱动.
我们不需要任何额外的配置来使关系正常工作。
只是不要忘记 Cascade Persist 和 Deletion 的 Doctrine 配置:
在 class 用户中:
public class User extends BaseUser{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
// The rest of the class
}
在 UserAdmin class 中:
protected function configureFormFields(FormMapper $formMapper)
{
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("details.test")
->end()
->end();
}
我想围绕 Sonata 创建我的应用程序,但我遇到了一些问题...
我扩展了 BaseUser 来创建我自己的用户,我也为 UserAdmin 做了同样的事情。 我创建了另一个实体,用户在该实体上具有 OneToOne 关系,但我不希望该实体可由具有链接到该实体的管理员的用户管理。
我希望用户填写这些实体的唯一方法是通过 UserAdmin,我试过这样的方法:
protected function configureFormFields(FormMapper $formMapper){
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("test", EntityType::class, array(
"class" => "AppBundle:PersonDetails",
"property_path" => "details.test"
))
->end()
->end();
}
这是我的用户 class :
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails")
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
public function __construct()
{
parent::__construct();
$this->details = new PersonDetails();
}
/**
* @return PersonDetails
*/
public function getDetails()
{
return $this->details;
}
/**
* @param PersonDetails $details
*/
public function setDetails($details)
{
$this->details = $details;
}
}
我得到的唯一东西是 select,它要我选择现有的 PersonDetails(我想)。
我怎样才能做到这一点?而且,如果它很容易实现,为什么它没有出现在文档中?我觉得这种情况并不少见..
感谢您的帮助
Sonata 将尝试解析传递给 add("test")
的字符串,因此我们可以通过一个简单的 add("details.test")
访问我们的实体 不受任何 Sonata 管理 驱动.
我们不需要任何额外的配置来使关系正常工作。 只是不要忘记 Cascade Persist 和 Deletion 的 Doctrine 配置:
在 class 用户中:
public class User extends BaseUser{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
// The rest of the class
}
在 UserAdmin class 中:
protected function configureFormFields(FormMapper $formMapper)
{
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("details.test")
->end()
->end();
}