我正在使用WordPress Symfony包并为其创建实体。
我有一个Comment
实体,$comment->user
已映射到User
实体。
然而 WordPress使用0
来表示来宾用户。它在Doctrine中导致很多问题,因为id为零的用户永远不存在。它会导致以下问题:
$comment->getUser()
为user_id
时,0
可能会抛出一个未找到实体的实例。$comment->setUser()
不起作用,因为您无法使用null
来重新同意来宾(应使用0
),而且您也不能使用new User(0)
。默认情况下,以下代码会将null
保存到数据库中的user_id
列:
$comment->setUser(null);
是否可以将0
(而不是null
)保存到user_id
列?
或者甚至更好,我可以在处理0
列时交换null
和user_id
吗?
感谢您的时间。
// if a guest posted a comment, pass null to setUser()
// although the actual value will be saved to user_id column is 0
$guestComment->setUser(null);
// if a comment was posted by a guest, getUser() should return null
// although the actual value returned by user_id column is 0
$guestComment->getUser(); // return null
// if a member posted a comment, pass a User entity to setUser()
$memberComment->setUser(new User());
// if a comment was posted by a member, getUser() should return the User entity
$guestComment->getUser(); // return User entity.
我正在寻找创建自定义映射类型 http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html
答案 0 :(得分:2)
我通过创建自定义类型来解决问题:
https://github.com/kayue/WordpressBundle/blob/master/Types/WordPressIdType.php
<?php
/**
* Datatype for WordPress's IDs
*
* WordPress use 0 to represent a guest user. It cause a lots of problems
* in Doctrine because the user with id zero never exist. This datatype
* convert 0 to null, make life easier.
*/
namespace Hypebeast\WordpressBundle\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\BigIntType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class WordPressIdType extends BigIntType
{
const NAME = 'wordpressid';
public function convertToPHPValue($value, AbstractPlatform $platform)
{
if($value === 0) {
return null;
}
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if($value === null) {
return 0;
}
return $value;
}
public function getName()
{
return self::NAME;
}
}
答案 1 :(得分:-1)
是的,这很简单。
只需将setUser
函数替换为将0转换为null的函数,并将getUser
函数替换为将null转换为0的函数。
public function setUser($user) {
if($user == 0) {
$user = null;
}
$this->user = $user;
}
public function getUser() {
return $this->user == null ? 0 : $this->user;
}
对于你的吸气者和制定者可以做什么,学说2并不以任何方式限制你。 (或您实体中的任何方法)