我有两个实体:Program
和Widget
程序
class Program
{
....
/**
* @Assert\Valid
*
* @ORM\OneToOne(targetEntity="Widget", inversedBy="program", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinColumn(nullable=true)
*/
private $widget;
}
窗口小部件
class Widget
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="integer")
*/
private $addressId;
/**
* @ORM\Column(type="integer")
*/
private $extAddressId;
/**
* @ORM\Column(type="string")
*/
private $language;
/**
* @ORM\OneToOne(targetEntity="Program", mappedBy="widget")
*/
private $program;
}
我有两个问题。
首先,我需要在Widget
,addressId
或extAddressId
上添加条件约束,而不是两者。
widget
不需要第二个Program
。您可以将所有表单字段留空,就像您不想在窗体中添加窗口小部件或填充表单一样,但您必须遵守条件约束,当然还有必需的字段。
我试图添加一个Callback
,因为它在官方文档here中解释,但我不知道如何结合两者。
首先,您必须定义Assert von widget关系,例如
Column Widet
@Assert\Valid()
接下来,您必须使用窗口小部件本身的表达式,例如
Column adressId
@Assert\Expression(
* expression=" (this.getAdressId() and !this.extAdressId()) or !this.getAdressId() ",
* message="error.cant_be_enabled_with_adress_id"
* )
Column extAdressId
@Assert\Expression(
* expression=" (this.getExtAddressId() and !this.getAdressId()) or !this.getExtAdressId() ",
* message="error.cant_be_enabled_with_adress_id"
* )