Doctrine 2定义没有创建列的属性类型

问题描述 投票:0回答:1

我有一个绑定到ZF / Laminas表单的地址实体。

定义了一些属性。例如街道,乡村,....

/**
 * @var string
 *
 * @ORM\Column(type="string", length=2)
 */
protected $country;

/**
 * @var float
 *
 * @ORM\Column(type="float", nullable=true)
 */
protected $longitude;

/**
 * @var float
 *
 * @ORM\Column(type="float", nullable=true)
 */
protected $latitude;

和非存储属性通过EventListener强制进行地理定位

/**
 * @var bool
 */
protected $geolocation = true;

带有访问器

/**
 * @param bool $geolocation
 *
 * @return self
 */
public function setGeolocation(bool $geolocation): self
{
    $this->geolocation = $geolocation;

    return $this;
}

问题在于通过访问器进行水合作用。 “ geolocation”的值来自字符串类型“ 1”或“ 0”的复选框(复选框)

水合由DoctrineObject水合器进行,但属性不受ORM管理。因此,在启用严格类型模式的情况下,由于setGeolocation()参数类型而引发异常。

它应该与@ORM\Column(type="boolean")一起使用,但我不想存储此值。

如何在不在db中创建列的情况下定义实体属性?

doctrine-orm zend-framework2 zend-framework3 laminas
1个回答
1
投票
我认为您没有教义或水合问题,类型转换有问题。

[当该值来自Laminas\Form\Form对象时,则应使用InputFilter将其转换为带过滤器的布尔值。然后,ObjectHydrator将从输入过滤器中获取值。

让我们看一下我的示例(为简单起见,我在这里不使用Doctrine):

<?php declare(strict_types=1); class MyEntity { private bool $mycheckbox = false; public function getMycheckbox(): bool { return $this->mycheckbox; } public function setMycheckbox(bool $mycheckbox): void { $this->mycheckbox = $mycheckbox; } } use Laminas\Form\Form; use Laminas\InputFilter\InputFilterProviderInterface; use Laminas\Form\Element; use Laminas\Filter; use Laminas\Hydrator\ClassMethods as Hydrator; class MyForm extends Form implements InputFilterProviderInterface { public function init(): void { $this->add([ 'name' => 'mycheckbox', 'type' => Element\Checkbox::class, 'options' => [], ]); $this->setObject(new MyEntity()); $this->setHydrator(new Hydrator()); } public function getInputFilterSpecification(): array { return [ 'mycheckbox' => [ 'filters' => [ // this filter is the important part [ 'name' => Filter\Boolean::class, 'options' => [], ] ], ], ]; } } $form = new MyForm(); $form->init(); $form->setData(['mycheckbox' => '1']); var_dump($form->isValid()); var_dump($form->getInputFilter()->getValues()); var_dump($form->getObject());

这里的输出是:

bool(true) array(1) { 'mycheckbox' => bool(true) } class MyEntity#9 (1) { private $mycheckbox => bool(true) }

© www.soinside.com 2019 - 2024. All rights reserved.