1

問題:

WordPress Symfony バンドルに取り組んでおり、そのエンティティを作成しています。

エンティティがあり、Commentエンティティに$comment->userマップされていUserます。

ただし、 WordPress0はゲスト ユーザーを表すために使用します。ID 0 のユーザーは決して存在しないため、Doctrine で多くの問題が発生します。これにより、次の問題が発生します。

  • $comment->getUser()行が の場合、エンティティが見つからないという例外をスローする可能性がありuser_idます0
  • $comment->setUser()nullrepensent guest には使用できず( を使用する必要0があります)、new User(0)どちらも使用できないため、 は機能しません。

質問:

デフォルトでは、次のコードはデータベースの列に保存nullします:user_id

$comment->setUser(null);

Doctrine を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

4

2 に答える 2

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;
    }
}
于 2012-06-24T03:29:58.663 に答える
-1

はい、とても簡単です。

setUser関数を 0 を null に変換する関数に置き換え、関数を null を 0 に変換する関数に置き換えるだけgetUserです。

public function setUser($user) {
    if($user == 0) {
        $user = null;
    }

    $this->user = $user;
}

public function getUser() {
    return $this->user == null ? 0 : $this->user;
}

Doctrine 2 は、getter と setter ができることに関して、決してあなたを制限しません。(または、エンティティ内の任意のメソッド)

于 2012-06-23T12:50:06.017 に答える