在Doctrine 2结果中交换原始值

时间:2012-06-23 03:14:22

标签: php symfony1 doctrine doctrine-orm

问题:

我正在使用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列时交换nulluser_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

2 个答案:

答案 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并不以任何方式限制你。 (或您实体中的任何方法)