1

私は次のエンティティを持っています:

class Employee {

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $employeeId;

/**
 * @ORM\Column(type="string", length=45, unique=true)
 */
protected $username;

/**
 * @ORM\Column(type="string", length=255, nullable=false)
 */
protected $email;

そして、私は次のコードを実行しています:

$employee = new Employee();
$employee->setUsername('test');

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

ご覧のとおり、メール列の値を設定していません。

しかし、持続すると次のようになります。

SQLSTATE[23000]: 整合性制約違反: 1048 列 'email' を null にすることはできません

Doctrine はすべてのエンティティ列を INSERT クエリに追加し、メール列に null 値を設定するためです。

挿入時に設定されていない列をスキップする方法はありますか? または、Doctrine が null 以外の文字列列のデフォルト値として '' (空の文字列) を挿入するようにするには?

4

3 に答える 3

2

列を許可するか、次のようnullに設定できnullable=trueます。

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
protected $email;

これにより、SQL エラーは発生しません。ただし、一貫性を保ちたい場合は、検証を使用して、永続化の前に空のフィールドを処理できるようにします。

use Symfony\Component\Validator\Constraints as Assert;

...

/**
 * @Assert\NotBlank()
 * @ORM\Column(type="string", length=255)
 */
protected $email;

このようにして、たとえばドキュメントに記載されているように、より具体的な方法で検証エラーを処理できます。

$author = new Author();
// ... do something to the $author object

$validator = $this->get('validator');
$errors = $validator->validate($author);

if (count($errors) > 0) {
    return new Response(print_r($errors, true));
} else {
    return new Response('The author is valid! Yes!');
}

列の単純なデフォルト値が必要な場合は、この質問をご覧ください。

于 2012-10-08T11:16:28.970 に答える
0

デフォルト値を設定するには、エンティティ __construct を使用するだけでよいようです。

__construct() {
    $this->email = '';
}
于 2012-10-08T10:28:04.553 に答える
0

教義ではなく、データモデルの問題です。すべてのレコードが電子メール列に何らかの値を持つ必要があることを明示的に宣言します。したがって、エンティティから NOT NULL 制約を削除するか、メール列に値を設定するだけです。この場合、doctrine はあなたが指示したことだけを実行します。

于 2012-10-08T11:00:00.040 に答える