Trong bảng DB của chúng tôi, chúng tôi cột refID
và date
là một khóa chính composite, với một lĩnh vực nhận dạng được ánh xạ như một datetime
:thuyết 2 ORM DateTime trường trong nhận dạng
class corpWalletJournal
{
/**
* @ORM\Column(name="refID", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $refID;
/**
* @ORM\Column(name="date", type="datetime", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $date;
public function setRefID($refID)
{
$this->refID = $refID;
}
public function setDate(\DateTime $date)
{
$this->date = $date;
}
}
Nếu chúng tôi mô tả chúng trong thực thể như @ORM \ Id mã này sẽ trở lại ngoại lệ "không thể chuyển đổi datetime để chuỗi" ...
$filter = array(
'date' => $this->stringToDate($loopData['date']),
'refID' => $loopData['refID']
));
$oCorpWJ = $this->em->getRepository('EveDataBundle:corpWalletJournal')->findOneBy($filter);
// ...
$oCorpWJ->setDate($this->stringToDate($loopData['date']));
// ...
Nếu chúng tôi mô tả corpWalletJournal#date
như một cột đơn giản, mã hoạt động tốt. Tại sao?
Làm cách nào để chúng tôi có thể giải quyết vấn đề này? Chúng tôi cần có cả hai số date
và refID
trong khóa chính.
thêm:
Vì vậy, tôi tạo ra lớp mới
use \DateTime;
class DateTimeEx extends DateTime
{
public function __toString()
{
return $this->format('Y-m-d h:i:s');
}
}
Và kiểu mới cho nó
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Eve\DataBundle\Entity\Type\DateTimeEx;
class DateTimeEx extends Type
{
const DateTimeEx = 'datetime_ex';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'my_datetime_ex';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return new DateTimeEx($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value->format('Y-m-d h:i:s');
}
public function getName()
{
return self::DateTimeEx;
}
public function canRequireSQLConversion()
{
return true;
}
}
Làm thế nào tôi có thể sử dụng chúng trong thực thể?
của tôi (chỉnh sửa) Gõ Lớp
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class DateTimeEx extends Type
{
const DateTimeEx = 'datetime_ex';
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'my_datetime_ex';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return $value;
}
public function getName()
{
return self::DateTimeEx;
}
}
bạn có thể giải thích, ở đâu và như thế nào tôi cần thay đổi lớp DateTime? và cách sử dụng nó trên ví dụ của tôi – user1954544
Bạn chỉ cần mở rộng lớp 'DateTime' với lớp' của riêng bạn MyDateTime extends \ DateTime {public function __toString() {return $ this-> format ('U'); }} '. Tôi đã cập nhật câu trả lời. Phần còn lại nằm trong tài liệu được liên kết (liên kết đến các loại trường tùy chỉnh: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#custom-mapping-types) – Ocramius
i đã thêm mã \ classes vào bài đăng hàng đầu, bạn có thể giải thích cách tôi có thể sử dụng chúng không? – user1954544