Php 从ZF2 Doctrine2中的更新中排除实体字段
我的情况是需要更新Doctrine2实体并排除一些字段 使用ZF2,我可以使用Zend\Form和验证过滤器处理更新。尤其是Php 从ZF2 Doctrine2中的更新中排除实体字段,php,doctrine-orm,zend-framework2,Php,Doctrine Orm,Zend Framework2,我的情况是需要更新Doctrine2实体并排除一些字段 使用ZF2,我可以使用Zend\Form和验证过滤器处理更新。尤其是Dish实体有一个名为photo的blob列,它是必需的。在更新期间,我只想在提供新文件的情况下替换照片 这里有更新dish的实体和控制器操作的源代码 Dish\Entity\Dish.php 实际上,我将$dish->photo属性设置为NULL,但这违反了DB NOT NULL约束 如何告诉Doctrine在运行时从更新中排除特定的实体字段?Doctrine将数据库级别
Dish
实体有一个名为photo
的blob列,它是必需的。在更新期间,我只想在提供新文件的情况下替换照片
这里有更新dish的实体和控制器操作的源代码
Dish\Entity\Dish.php
实际上,我将$dish->photo
属性设置为NULL
,但这违反了DB NOT NULL约束
如何告诉Doctrine在运行时从更新中排除特定的实体字段?Doctrine将数据库级别中每列的
null
属性默认映射为false
,因为您没有在注释中设置任何null
标志:
/**
* @ORM\Column(type="blob")
*/
protected $photo;
/**
* @ORM\Column(type="blob", nullable=true)
*/
protected $photo;
这意味着,“Photo是必需的,不能用空值插入或更新行的Photo列”
如果希望数据库中有null
值,请使用以下注释:
/**
* @ORM\Column(type="blob")
*/
protected $photo;
/**
* @ORM\Column(type="blob", nullable=true)
*/
protected $photo;
在它的setter中,不要忘记null
默认参数值:
public function setPhoto($photo = null)
{
$this->photo = $photo;
}
关于这个问题;似乎在操作中的每个编辑操作上都设置了一个新的Dish对象:
$form->setHydrator($hydrator)
->setObject(new Dish)
->setInputFilter($filter);
这在创建新的碟形对象时是正确的。编辑时,必须将已持久化的Dish实例设置为表单:
// I'm just writing to explain the flow.
// Accessing the object repository in action level is not a good practice.
// Use a DishService for example.
$id = 32; // Grab it from route or elsewhere
$repo = $entityManager->getRepository('Dishes\Entity\Dish');
$existingDish = $repo->findOne((int) $id);
$form->setHydrator($hydrator)
->setObject($existingDish)
->setInputFilter($filter);
我假设这是对现有菜肴的编辑操作
因此,由于您通过表单提供了一个已经填充的Dish实例,所以在下一次调用中,水合器将正确处理已更改和未触及的字段
我还建议从InputFilterManager
获取DishFilter
,而不是在操作级别手动创建它:
// $filter = new DishFilter();
$filter = $serviceLocator->get('InputFilterManager')->get(DishFilter::class);
// Exclude the photo on validation:
$filter->setValidationGroup('name', 'description', 'time', 'complexity');
希望有帮助。原则将数据库级别中每一列的
nullable
属性默认映射为false
,因为您没有在注释中设置任何nullable
标志:
/**
* @ORM\Column(type="blob")
*/
protected $photo;
/**
* @ORM\Column(type="blob", nullable=true)
*/
protected $photo;
这意味着,“Photo是必需的,不能用空值插入或更新行的Photo列”
如果希望数据库中有null
值,请使用以下注释:
/**
* @ORM\Column(type="blob")
*/
protected $photo;
/**
* @ORM\Column(type="blob", nullable=true)
*/
protected $photo;
在它的setter中,不要忘记null
默认参数值:
public function setPhoto($photo = null)
{
$this->photo = $photo;
}
关于这个问题;似乎在操作中的每个编辑操作上都设置了一个新的Dish对象:
$form->setHydrator($hydrator)
->setObject(new Dish)
->setInputFilter($filter);
这在创建新的碟形对象时是正确的。编辑时,必须将已持久化的Dish实例设置为表单:
// I'm just writing to explain the flow.
// Accessing the object repository in action level is not a good practice.
// Use a DishService for example.
$id = 32; // Grab it from route or elsewhere
$repo = $entityManager->getRepository('Dishes\Entity\Dish');
$existingDish = $repo->findOne((int) $id);
$form->setHydrator($hydrator)
->setObject($existingDish)
->setInputFilter($filter);
我假设这是对现有菜肴的编辑操作
因此,由于您通过表单提供了一个已经填充的Dish实例,所以在下一次调用中,水合器将正确处理已更改和未触及的字段
我还建议从InputFilterManager
获取DishFilter
,而不是在操作级别手动创建它:
// $filter = new DishFilter();
$filter = $serviceLocator->get('InputFilterManager')->get(DishFilter::class);
// Exclude the photo on validation:
$filter->setValidationGroup('name', 'description', 'time', 'complexity');
希望有帮助。谢谢你的帮助。我将我的代码编辑成一个有效的解决方案,特别是我不会禁用对照片的验证,因为如果存在,我需要验证它。Zend\Form如果没有提供文件,则将photo属性设置为空数组,因此我备份了doctrine提供的流,如果没有新图像,则将其还原。感谢帮助。我将我的代码编辑成一个有效的解决方案,特别是我不会禁用对照片的验证,因为如果存在,我需要验证它。Zend\Form如果没有提供文件,则将photo属性设置为空数组,因此我备份了doctrine提供的流,如果没有新图像,则将其还原。