Php 从ZF2 Doctrine2中的更新中排除实体字段

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将数据库级别

我的情况是需要更新Doctrine2实体并排除一些字段

使用ZF2,我可以使用Zend\Form和验证过滤器处理更新。尤其是
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提供的流,如果没有新图像,则将其还原。