1

実在物

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Table(name="_apiKey")
 * @ORM\Entity(repositoryClass="Eve\ProfileBundle\Entity\Repository\apiKeyRepository")
 * @UniqueEntity(fields={"keyID", "vCode", "accountID"}, 
 * message="you already own this api")
 */
class apiKey
{

public function __construct()
{
    // empty
}

// relations start
// relations end

/**
 * @ORM\Column(name="entryID", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $entryID;

/**
 * @ORM\Column(name="accountID", type="integer", nullable=false, unique=true)
 */
private $accountID;

/**
 * @ORM\Column(name="keyID", type="integer", nullable=false, unique=true)
 * @Assert\NotBlank(message="keyID cannot be blank")
 */
private $keyID;

/**
 * @ORM\Column(name="vCode", type="string", nullable=false, unique=true)
 * @Assert\NotBlank(message="vCode cannot be blank")
 */
private $vCode;

dbで

CREATE TABLE IF NOT EXISTS `_apiKey` (
  `entryID` int(11) NOT NULL AUTO_INCREMENT,
  `accountID` int(11) NOT NULL,
  `keyID` int(11) NOT NULL,
  `vCode` varchar(255) NOT NULL,
  PRIMARY KEY (`entryID`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;

複製を追加しようとすると、エラーが発生します

An exception occurred while executing 'INSERT INTO _apiKey (accountID, keyID, vCode) VALUES (?, ?, ?)' with params {"1":38,"2":"1233","3":"123"}:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '38-1233-123' for key 'accountID' 

それは問題ありませんが、どうすれば処理できますか?「メッセージオプション」が@UniqueEntity()で機能しないフォームエラーでこのエラーを表示するにはどうすればよいですか(例外なし)

私が欲しいもの(entryIDのないdbの簡単な例)

123 123 123 - add
123 123 1234 - add
123 125 123 - add
123 123 1234 - form-error on inserting
123 123 123 - form-error on inserting
234 123 123 - add
234 123 123 - form-error on inserting
4

2 に答える 2

4

キー'accountID'の重複エントリ'38-1233-123 '

accountIdのみの一意性を確認する場合は、これをクラスに追加します。

@UniqueEntity(fields={"accountID"}, message="This account is already taken")

ここでは、組み合わせ「keyID」、「vCode」、「accountID」の一意性と「accountID」のみの一意性をチェックする完全なコードを示します。

<?php

// ...

/**
 * @ORM\Table(name="_apiKey")
 * @ORM\Entity(repositoryClass="Eve\ProfileBundle\Entity\Repository\apiKeyRepository")
 * @UniqueEntity(fields={"keyID", "vCode", "accountID"}, message="you already own this api")
 * @UniqueEntity(fields={"accountID"}, message="This account ID is already taken")
 */
class apiKey
{

エラーがフィールドaccountIDにのみ影響することを確認したかどうかはわかりません。この動作を望まない場合は、プロパティ$accountIDから「unique=true」を削除してください。

cominaison "keyID"、 "vCode"、 "accountID"はデータベース内で一意である必要があるとだけ言いたい場合は、次のように進めます。

/**
 * @ORM\Table(name="_apiKey",
 *      uniqueConstraints = {
 *          @ORM\UniqueConstraint(name="_api_key_key_id_v_code_account_id", columns={"keyID", "vCode", "accountID})
 *      }
 * )
 *
 * ...
 * etc, ...
 */
class apiKey
于 2013-01-27T13:31:33.783 に答える
0

問題はフォームタイプクラスにありました。この一意の組み合わせを機能させるには、一意にしたいフィールドにすべての値を追加する必要があります。私の例では、

  $builder
            ->add('accountID', 'hidden', array ('data' => $options['acountID']))
            ->add('keyID', 'text')
            ->add('vCode', 'text');

非表示フィールド(accontID)を追加してデータを入力すると、フォームエラーに適切なエラーが発生します。入力しないとnull値になります(一意をチェックしない理由がわかりません)

それは私にとっての解決策ですが、基本的に@Sybioは私が多くを理解するのを助けてくれるので、私は彼の答えを答えとしてチェックします^ _ ^

于 2013-01-28T12:07:52.223 に答える