我有这个场景
class Foo
{
/**
* @ORM\Id
* @ORM\Column(type="date")
*/
protected $date;
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity"Bar", inversedBy="foo")
*/
protected $bar;
[...]
}
class FooRepository extends EntityRepository
{
public function dummyNameFunction()
{
$q = $this->createQueryBuilder('foo')
->//some dummy "components" added to builder
->getQuery()
;
//I need an ArrayCollection as I want to take advantage of
//Doctrine's ArrayCollection filter() function
return new ArrayCollection($q->getResult());
}
}
只要我尝试从db中获取数据,就会出现此错误
ContextErrorException:Catchable Fatal Error:类DateTime的对象 无法转换为字符串 /path/to/project/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 第2504行
对我来说,这很“非常清楚”:从Array
对象转换为ArrayCollection
,Doctrine希望使用实体的id(s)索引全新的ArrayCollection
,但是,由于密钥是日期时间,因此PHP本身不提供__toString()
方法(或等效方法)。
我想到的可能的解决方案:
$date
和$bar
中删除ID并设置约束以使其唯一。缺点:我有一个完全没用的文件。Date
。缺点:我现在不会,因为我还没有尝试过。首先,您需要定义Doctrine2服装类型。你怎么能这样做?
我在我的包中创建了一个文件夹(以保持Doctrine2原始包结构安全)Doctrine\DBAL\Types
。然后,在里面,我创建了这个类
<?php
namespace Company\BundleName\Doctrine\DBAL\Types;
use Doctrine\DBAL\Types\DateType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class CustomDate extends DateType
{
private $date_value;
public function getName()
{
return 'custom_date';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
$date = parent::convertToPHPValue($value, $platform);
$this->date_value = $date;
return $date->format('Y-m-d');
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return ($value !== null)
? $value : null;
}
}
然后我添加了一个boot()方法来捆绑bootstrap文件(你需要在AppKernel.php中注册bundle所需的文件)
public function boot()
{
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('custom_date', 'Company\BundleName\Doctrine\DBAL\Types\CustomDate');
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('custom_date','custom_date');
}
之后我就是mod。 Foo的$date
变量
/**
* @ORM\Id
* @ORM\Column(type="custom_date")
*/
protected $date;
答案 0 :(得分:0)
似乎唯一的解决方案是创建一个全新的学说类型(我称之为#34;脏解决方案&#34;此处)因为UnitOfWork需要字符串或整数才能正常工作。