2011-12-17 34 views
23

मैं अपने सिद्धांत 2 इकाई में एक अद्वितीय बाधा बनाना चाहता हूं जैसे name & test अद्वितीय स्तंभानुसार हैं। मतलबसिद्धांत 2 में अद्वितीय बाधाएं, सिम्फनी 2

  • obj1

    • नाम: name1
    • परीक्षण: परीक्षण
  • obj2

    • नाम: NAME2
    • परीक्षण: परीक्षण < ----

यह दोहराया के रूप में परीक्षण दोहराया गया है, जो त्रुटि पैदा करना चाहिए।

मैंने अद्वितीय बाधा (Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity) का उपयोग करने की कोशिश की। की कोशिश की

* @UniqueEntity("name") 
* @UniqueEntity("test") 

और

* @UniqueEntity({"name", "test"}) 

दोनों ही ट्रिगर त्रुटि लगते हैं जब मैं दोनों नाम और परीक्षण दोहराया गया है। जैसे।

  • obj1

    • नाम: name1
    • परीक्षण: परीक्षण
  • obj2

    • नाम: NAME2
    • परीक्षण: परीक्षण

क्या सही सेटअप? या मैंने कहीं गलती की हो सकती है?

शायद मैं जैसे सिद्धांत एनोटेशन शामिल करना चाहिए:

@Table(name="ecommerce_products",uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "email"})}) 

लेकिन है कि अभी भी अभ्यस्त मेरी सिम्फोनी फ़ॉर्म सत्यापन मुझे लगता है कि संभाल?

अद्यतन

मेरे परीक्षण कोड:

/** 
* @ORM\Entity 
* @ORM\Table(name="roles") 
* @UniqueEntity("name") 
* @UniqueEntity("test") 
*/ 
class Role { 

    /** 
    * @var integer 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(type="string", length=32, unique=true) 
    * @Assert\MaxLength(32) 
    * @Assert\Regex("/^[a-zA-Z0-9_]+$/") 
    */ 
    protected $name; 

} 

$v = $this->get('validator'); 

$role = new Role(); 
$role->setName('jm'); 
$role->setTest('test'); 
$e = $v->validate($role); 
echo '=== 1 ==='; 
var_dump($e); 
if (count($e) == 0) 
    $em->persist($role);    

$role2 = new Role(); 
$role2->setName('john'); 
$role2->setTest('test'); 
$e = $v->validate($role2); 
echo '=== 2 ==='; 
var_dump($e); 
if (count($e) == 0) 
    $em->persist($role2); 

$em->flush(); 

पहली बार चलाने (खाली टेबल) पर:

=== 1 ===object(Symfony\Component\Validator\ConstraintViolationList)#322 (1) { 
    ["violations":protected]=> 
    array(0) { 
    } 
} 
=== 2 ===object(Symfony\Component\Validator\ConstraintViolationList)#289 (1) { 
    ["violations":protected]=> 
    array(0) { 
    } 
} 

लेकिन मैं अद्वितीय बाधा के बारे में डेटाबेस परत पर एक त्रुटि प्राप्त करते हैं। तो मुझे सत्यापन कार्य को कैसे काम करना चाहिए?

+0

अपने दूसरे उदाहरण में, खेतों में से कोई भी दोहराया गया है। यह आपके प्रश्न को थोड़ा अस्पष्ट बनाता है। – greg0ire

+0

@ gre0ire, 'test' डुप्लिकेट किया गया है? –

+0

ओह क्षमा करें। लेकिन इससे पहले, आप "दोनों" कहते हैं। तो दूसरे उदाहरण के साथ क्या मामला है? – greg0ire

उत्तर

49

अलग-अलग क्षेत्रों के लिए इन जांच:

@UniqueEntity("name") 
@UniqueEntity("test") 

जब वहाँ एक डुप्लिकेट name मूल्य है, पहले एक शुरू हो जाएगा यही कारण है, जबकि दूसरा एक - जब वहाँ एक डुप्लिकेट test मूल्यों है।

आप सत्यापन में विफल हो जाने दोनोंname और test ही संयोजन शामिल चाहते हैं, तो आप इस का उपयोग करें:

@UniqueEntity({"name", "test"}) 

क्या आप पहली बार दृष्टिकोण से काम करना चाहिए चाहते हैं के लिए - जब तक आप कुछ गलत किया है कहीं और। यह सुनिश्चित करने के लिए कैश को साफ़ करने का भी प्रयास करें कि यह उसकी गलती नहीं है।

अद्यतन

मैं क्या सुझाव दिया एप्लिकेशन पक्ष पर मान्यता भाग के बारे में था।

@Column(type = "string", unique = true) 
private $name; 

@Column(type = "string", unique = true) 
private $test; 

इन तरीकों पूरक: आप उन्हें एक दूसरे से स्वतंत्र अद्वितीय बनाने के लिए चाहते हैं, तो निश्चित रूप से - आप सिद्धांत का उपयोग कर डेटाबेस स्कीमा उत्पन्न हैं, तो आप के लिए प्रत्येक स्तंभ सिद्धांत के स्तर का एनोटेशन देने की आवश्यकता होगी एक दूसरे - बाहर नहीं। @UniqueEntity सुनिश्चित करता है कि एक डुप्लिकेट डेटाबेस परत तक भी नहीं पहुंचता है, जबकि @Column यह सुनिश्चित करता है कि यदि ऐसा होता है, तो डेटाबेस परत इसे पास नहीं होने देगी।

+0

अजीब बात 'अनोखाइन्टिटी' के लिए है, यह काम नहीं करती है! यह केवल एक त्रुटि को ट्रिगर करता है जब दोनों फ़ील्ड डुप्लिकेट करते हैं, तो जल्द ही मुख्य प्रश्न पर मेरा अपडेट देखें –

+0

यदि मैं '@ UniqueEntity' का उपयोग करना चाहता हूं, तो मेरे कोड में मुझे इसे कब रखना चाहिए? इकाई वर्ग पर – Shawn

+0

@ शॉन। –

47

तालिका एनोटेशन में, आप एकाधिक columns के लिए एक इंडेक्स भी सेट कर सकते हैं।

 
/** 
* @ORM\Entity 
* @ORM\Table(name="ecommerce_products",uniqueConstraints={ 
*  @ORM\UniqueConstraint(name="search_idx", columns={"name", "email"})}) 
*/ 

या YAML प्रारूप के साथ:

Namespace\Entity\EntityName: 
    type: entity 
    table: ecommerce_products 
    uniqueConstraints: 
     uniqueConstraint: 
      columns: [name, email] 
+0

और जब फ़ील्ड किसी अन्य तालिका से संबंधित है? 'निजी $ लेखक 'की तरह।आप अद्वितीय में न तो लेखक या लेखक_आईडी नहीं डाल सकते हैं। मैं इसे कैसे हल करूं? –

+0

@hugomn अगर यह एनीथेड इकाई के लिए lonked है आप जोड़ सकते हैं: "myEntity_id"। @ -yvoyer को एक प्रश्न: आप एक कॉस्टम संदेश कैसे जोड़ सकते हैं? (या त्रुटि पृष्ठ की सवारी कैसे प्राप्त करें?) – mboullouz

+0

@ ह्यूगोमन, मुझे लगता है कि शामिल कॉलम के आधार पर बाधा को परिभाषित करना अभी भी काम करेगा। पूर्व। यह देखते हुए कि आपके पास एक विशेषता है जिसे '@ जॉइन कॉलम (नाम = "ग्राहक_आईडी", संदर्भित कॉलमनाम = "आईडी") परिभाषित किया गया है,' बाधा में 'ग्राहक_आईडी' निर्दिष्ट करना चाहिए ... मेरा अनुमान यह है कि अद्वितीय बाधा mysql से परिभाषाओं का उपयोग कर रही है PHP नहीं मेरा मतलब यह है कि अद्वितीय बाधा में mysql कॉलम 'customer_id' का नाम होना चाहिए, न कि PHP विशेषता '$ ग्राहक'। – yvoyer

संबंधित मुद्दे