web-dev-qa-db-ja.com

doctrineエンティティブールフィールドをnullではなく0に設定します

doctrineエンティティが値が0または1であるブールフィールドを持つエンティティを永続化しようとしています。

プロパティをtrueに設定すると、データベースに「1」として保存されます。ただし、「false」または「0」の場合は、データベースにNULLとして保存されます。

1または0としてのみ保存するようにこれを修正するにはどうすればよいですか?

私が使用するプロパティの注釈は次のようなものです:

@ORM\Column(name="substitute", type="boolean", nullable=true)

Nullableをfalseに設定すると、まだnullに設定したいため、永続化できません。

ありがとう

永続化すると、フィールド値は0になります

Attempt 1 @ORM\Column(name = "substitute"、type = "boolean"、options = {"default": "0"}))

エラー:nullを保存できません

Attempt 2 @ORM\Column(name = "substitute"、type = "boolean"、nullable = true、options = {"default": "0"}))

動作しません、それでもベースにnullを保存します

情報1

実際に挿入クエリが0を挿入しようとしています。しかし、このエラー「ORA-01400:NULLを(\ "MYBASE \"。\ "MYTABLE \"。\ "SUBSTITUTE\")"

情報2

別のエンティティと同じ追加

class TestEntity
{
    /**
     * @ORM\Column(name="test_entity_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="substitute", type="boolean")
     */
    private $isSubstitute = false;
}

しつこい

$test = new TestEntity();
$test->setIsSubstitute(false);
$em->persist($test);

結果

request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\NotNullConstraintViolationException: "An exception occurred while executing 'INSERT INTO TestEntity (test_entity_id, substitute) VALUES (?, ?)' with params [7, 0]: SQLSTATE[HY000]: General error: 1400 OCIStmtExecute: ORA-01400: cannot insert NULL into ("MYBASE"."TESTENTITY"."SUBSTITUTE")  (ext\pdo_oci\oci_statement.c:148)"\n (ext\\pdo_oci\\oci_statement.c:148) at PATH\\vendor\\doctrine\\dbal\\lib\\Doctrine\\DBAL\\Driver\\PDOStatement.php:91)"} []

情報

ociまたはoci8ドライバを使用して手動で挿入すると機能します

sql> INSERT INTO TestEntity (test_entity_id, substitute) VALUES (13, 0)
[2017-04-06 11:21:15] 1 row affected in 62ms
8
fliim

Paramters.ymlファイルでドライバーをociからoci8に変更します。

database_driver: oci8

それでうまくいくはずです。 OCI8のインストールには、 アンダーグラウンドPHPおよびOracleマニュアル を使用します。

1
Alvin Bunk

SQLのデフォルトを0に設定するだけです(編集:変更後にスキーマを更新する必要があります):

/**
 * @ORM\Column(type="boolean", options={"default":"0"})
 */
protected $isActive;

また、デフォルトでプロパティを初期化できます。

/**
 * @ORM\Column(type="boolean", options={"default":"0"})
 */
protected $isActive = false;

値がtrueまたはfalseに設定されている限り、null可能は問題になりません。

保存する前に実際にプロパティをfalseに設定しても、DBにnullとして保存される場合は、別のことが行われています。

8
Joe

$em->getReference(EntityName::class, "AnyValue");を使用して偽のオブジェクトを作成できます

ハッピーコーディング。

1

@Ceradの提案は正しいと思います、あなたは試すことができます:

/**
 * @ORM\Column(name="substitute", type="boolean")
 */
protected $substitute = false;

結果をお知らせください。

1
Alvin Bunk

私はあなたのケースを複製しただけで、trueの場合は1に、falseの場合は0に正常に保存できました。

例:

//Entity
Person: id, name, isMajor(boolean field)
//IMPORTANT: I setted the boolean field inside __construct() method, and let it be, by default, false (0). This means you don't need anymore to have that options={"default":"0"}.

//...
/**
 * @var bool
 *
 * @ORM\Column(name="isMajor", type="boolean", nullable=true)
 */
private $isMajor;

public function __construct() 
{
    $this->isMajor = false;
}

//Created CRUD against the Entity

//When saving (either using the default actions provided by the CRUD, or by setting the values inside another controller's action):
//AppBundle/Controller/DefaultController.php
/**
 * @Route("/new-person")
 */
public function createAction()
{
    $person = new Person();
    $person->setName('name');
    $person->setIsMajor(true); // this saves 1 in the table
    $person->setIsMajor(false); // this saves 0 in the table

    $em = $this->getDoctrine()->getManager();
    $em->persist($person);
    $em->flush();

    return $this->redirectToRoute('person_index');
}

私はあなたの問題をよく理解したと思います。

0
Dan Costinel