2015-10-13 4 views
8

हमने प्रोपेल और सिम्फनी 2 रूपों का उपयोग करके एक संग्रह बनाया है। हम बिना किसी समस्या के फॉर्म को सहेज सकते हैं और हम संग्रह का उपयोग करके दूसरा विकल्प जोड़ सकते हैं। हम तो बचाने के लिए और उसके बाद एक 3 संग्रह में जोड़ने के लिए हम निम्न त्रुटि मिल का प्रयास करें:Symfony2 + प्रोपेल संग्रह अपरिभाषित ऑफसेट: 2

Notice: Undefined offset: 2 

स्टैक ट्रेस

in src/app/MyBundle/Model/om/BaseLabelsLabelsLinesMapsQuery.php at line 241 

$cton0 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::ID, $key[0], Criteria::EQUAL); 
      $cton1 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::LABEL_ID, $key[1], Criteria::EQUAL); 
      $cton0->addAnd($cton1); 
      $cton2 = $this->getNewCriterion(LabelsLabelsLinesMapsPeer::LABEL_LINES_ID, $key[2], Criteria::EQUAL); 
      $cton0->addAnd($cton2); 
      $this->addOr($cton0); 
     } 

मैं नीचे प्रासंगिक कोड पोस्ट किया है के रूप में वहाँ शांत है एक पर्याप्त हालांकि, कोड की मात्रा हम सोच रहे थे कि किसी ने भी यही समस्या अनुभव की है।

मैंने एक अलग बिट कोड के साथ एक बग रिपोर्ट भेजी है जिसने एक ही त्रुटि बनाई है, हालांकि मुझे कोई जवाब नहीं मिला है। बग रिपोर्ट here है।

<table name="labels_labels_lines_maps" isCrossRef="true"> 
    <column name="id" 
      type="integer" 
      required="true" 
      autoIncrement="true" 
      primaryKey="true"/> 
    <column name="label_id" 
      type="integer" 
      primaryKey="true"/> 
    <column name="label_lines_id" 
      type="integer" 
      primaryKey="true"/> 
    <foreign-key foreignTable="labels" onDelete="cascade"> 
     <reference local="label_id" foreign="id"/> 
    </foreign-key> 
    <foreign-key foreignTable="labels_lines" onDelete="cascade"> 
     <reference local="label_lines_id" foreign="id"/> 
    </foreign-key> 
    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB" /> 
     <parameter name="Charset" value="utf8" /> 
    </vendor> 
</table> 

<table name="labels_lines"> 
    <column name="id" 
      type="integer" 
      required="true" 
      autoIncrement="true" 
      primaryKey="true"/> 
    <column name="placeholder_text" 
      type="varchar" 
      size="150"/> 
    <column name="font_id" 
      type="integer"/> 
    <column name="font_size" 
      type="integer"/> 
    <column name="x_axis" 
      type="integer"/> 
    <column name="y_axis" 
      type="integer"/> 
    <column name="width" 
      type="integer"/>  
    <column name="height" 
      type="integer"/>  
    <column name="colour" 
      type="varchar" 
      size="20"/>   
    <column name="angle" 
      type="integer"/> 
    <column name="is_volume" 
      type="boolean"/> 
    <column name="is_percentage" 
      type="boolean"/> 
    <column name="is_productof" 
      type="boolean"/> 
    <column name="is_type" 
      type="boolean"/> 
    <column name="is_occasion" 
      type="boolean"/>   
    <foreign-key foreignTable="font" onDelete="cascade"> 
     <reference local="font_id" foreign="id"/> 
    </foreign-key> 
    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB" /> 
     <parameter name="Charset" value="utf8" /> 
    </vendor> 
</table> 

<table name="occasion"> 
    <column name="id" 
      type="integer" 
      required="true" 
      autoIncrement="true" 
      primaryKey="true"/> 
    <column name="occasion" 
      type="varchar" 
      size="200"/> 

    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB" /> 
     <parameter name="Charset" value="utf8" /> 
    </vendor> 
</table> 

<table name="font"> 
    <column name="id" 
      type="integer" 
      required="true" 
      autoIncrement="true" 
      primaryKey="true"/> 
    <column name="name" 
      type="varchar" 
      size="100"/> 
    <column name="location" 
      size="300"/> 
    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB" /> 
     <parameter name="Charset" value="utf8" /> 
    </vendor> 
</table> 

नीचे दृश्य है (किसी भी स्टाइल के बिना)::

{{ form_start(form) }} 
{{ form_row(form._token) }} 
<ul class="labelsliness list-group" data-prototype="{{ form_widget(form.labelsliness.vars.prototype)|e }}"> 
        {% for lines in form.labelsliness %} 
         <li>{{ form(lines) }}</li> 
        {% endfor %} 
       </ul> 

       {{ form_row(form.save) }} 

{{ form_end(form) }} 

<script> 
        var $collectionHolder; 

        var $addLinesLink = $('<button class="add_line_link btn btn-primary">Add a line</button>'); 
        var $newLinkLi = $('<li></li>').append($addLinesLink); 

        $(document).ready(function(){ 
         $collectionHolder = $('ul.labelsliness'); 

         $collectionHolder.append($newLinkLi); 

         $collectionHolder.data('index', $collectionHolder.find(':input').length); 

         $addLinesLink.on('click', function(e) { 
          e.preventDefault(); 

          addLineForm($collectionHolder, $newLinkLi); 
         }); 
        }); 

        function addLineForm($collectionHolder, $newLinkLi) { 
         var prototype = $collectionHolder.data('prototype'); 

         var index = $collectionHolder.data('index'); 

         var newForm = prototype.replace('/__name__/g', index); 

         $collectionHolder.data('index', index + 1); 

         var $newFormLi = $('<li></li>').append(newForm); 

         $newFormLi.append('<button class="remove-line btn btn-danger">Remove</button>'); 

         $newLinkLi.before($newFormLi); 

         $('.remove-line').click(function(e){ 
          e.preventDefault(); 

          $(this).parent().remove(); 

          return false; 
         }); 
        } 
       </script> 

यह प्रासंगिक स्कीमा का एक टुकड़ा हैफॉर्म को संभालने वाला फॉर्म:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
       ->add("labelsliness", "collection", array(
        "type" => new LabelsLinesType(), 
        "allow_add" => true, 
        "allow_delete" => true, 
        "by_reference" => false 
       )) 
       ->add("save", "submit"); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AJSharp\EPCBundle\Model\Labels', 
     )); 
    } 

    public function getName() 
    { 
     return "label_form"; 
    } 

अंत में, नियंत्रक नीचे है।

public function editAction(Request $request, $id = null) 
    { 

     $labels = LabelsQuery::create()->findPk($id); 

     $form = $this->createForm(new EditLabelType(), $labels); 

     $form->handleRequest($request); 

     if ($form->isValid()) { 

      $labels->save(); 
      return $this->redirect($this->generateUrl("_admin_labels")); 
     } 

     return $this->render("AppLabelBundle:Admin:edit.html.twig", array("form" => $form->createView())); 
    } 
+0

और अपने 'BaseLabelsLabelsLinesMapsQuery.php' कोड है? – Alex

+0

@Alex जैसा कि स्क्रिप्ट में कुछ पंक्तियां हैं, मैंने इसे पेस्टबिन में कॉपी किया है। http://pastebin.com/WXgfN7yf। कृपया ध्यान दें कि यह कोड प्रोपेल द्वारा पूरी तरह से जेनरेट किया गया है। –

उत्तर

1

आपका स्कीमा एक छोटे से करने के लिए भ्रामक है (कि यदि आप के लिए क्या जा रहे हैं है) और अधिक प्रभावी हो सकता है मुझे।

<table name="labels_labels_lines_maps" isCrossRef="true"> 
    <column name="id" 
      type="integer" 
      required="true" 
      autoIncrement="true" 
      primaryKey="true"/> 
    <column name="label_id" 
      type="integer" 
      primaryKey="true"/> 
    <column name="label_lines_id" 
      type="integer" 
      primaryKey="true"/> 
    <foreign-key foreignTable="labels" onDelete="cascade"> 
     <reference local="label_id" foreign="id"/> 
    </foreign-key> 
    <foreign-key foreignTable="labels_lines" onDelete="cascade"> 
     <reference local="label_lines_id" foreign="id"/> 
    </foreign-key> 
    <vendor type="mysql"> 
     <parameter name="Engine" value="InnoDB" /> 
     <parameter name="Charset" value="utf8" /> 
    </vendor> 
</table> 

मैं अपनी परेशानी दूर हो सकता है की एक बहुत कुछ संदेह है, तो आप एक बात लेने और: नीचे इस बिट एक विदेशी कुंजी के रूप में उनमें से दो के साथ तीन प्राथमिक कुंजी और पंक्ति के लिए एक अद्वितीय पहचानकर्ता के रूप में उनमें से एक भी शामिल है इसके साथ बने रहें। या तो id हटाएं और अपनी प्राथमिक समग्र कुंजी दो विदेशी तालिकाओं का प्रतिनिधित्व करें, जो पूरी तरह से मान्य है, या अपनी PRIMARY KEY से UNIQUE अपनी प्रत्येक विदेशी कुंजी पर बाधाओं को बदलें, जिससे आपकी प्राथमिक कुंजी id हो। यह भी पूरी तरह से मान्य है।आखिरकार आपका निर्णय आपकी डिजाइन आवश्यकताओं पर आधारित होगा।

एक और टिप्पणी: आप या नहीं खासकर यदि आप प्राथमिक कुंजी में अलग-अलग स्तंभों को संदर्भित कर रहे हैं, एक heavyIndexing क्या करना चाहते हो सकता है। एक समग्र प्राथमिक कुंजी सभी तीन स्तंभों के खिलाफ एक इंडेक्स बनाता है, प्रत्येक व्यक्तिगत रूप से नहीं। यह आपके प्रोजेक्ट में महत्वपूर्ण हो सकता है या नहीं भी हो सकता है, लेकिन मैंने सोचा कि यह ध्यान देने योग्य होगा।

+0

हाय वहाँ, भारी इंडेक्सिंग के उल्लेख के लिए धन्यवाद। मैंने वास्तव में इसका कभी भी उपयोग नहीं किया है, इसलिए मैं इसे देख लूंगा। मैं मूल रूप से निम्न स्कीमा (propelorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-propel.html#many-to-many-relations) चल रहा था लेकिन जैसा कि आप ने बताया है। आईडी वास्तव में कई स्कीमा में नहीं है। मैं समझता हूं कि यह संभवतः इस मुद्दे का मूल कारण हो सकता है। मैं एक नज़र रखूंगा और आपसे वापस आऊंगा। –

0

मैं इस पर यकीन है कि 100% नहीं हूँ, लेकिन मैं काफी है क्योंकि इस लाइन कुछ कर रहा हूँ:

$labels = LabelsQuery::create()->findPk($id); 

आप अपने BaseQuery कक्षा में विधि findPkSimple में ध्यान देंगे यह है उम्मीद है कि परिवर्तनीय कुंजी 3 मानों के साथ एक सरणी है (सूचकांक 0, 1, 2)

कारण मुझे अनिश्चितता है कि मुझे नहीं पता कि $ id केवल एक मान या फ़ंक्शन परिभाषा के रूप में एक सरणी है आप प्रकार पर सीमित नहीं है। (आपका संपादन एक्शन फ़ंक्शन)

मुझे लगता है, क्योंकि आपके पास तीन प्राथमिक कुंजी हैं, जो वर्ग उत्पन्न होता है वह आपको प्राथमिक कुंजी द्वारा खोजते समय तीन अलग-अलग मान रखने की अपेक्षा करता है।

यह यदि आप केवल एक प्राथमिक कुंजी है, और फिर उन तीन स्तंभों पर एक अद्वितीय सूचकांक विशिष्टता सुनिश्चित करने के लिए

+0

बस यह स्पष्ट करने के लिए कि $ आईडी एक आईडी है और एक सरणी नहीं है। एक प्राथमिक कुंजी होने के लिए। मैं यहाँ (propelorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-propel.html#many-to-many-relations) से निम्नलिखित ले लिया है जो कई प्राथमिक कुंजी को दर्शाता है। हालांकि आईडी इस उदाहरण पर वास्तव में उदाहरण में नहीं है। –

+0

मुझे लगता है कि उदाहरण या तो पुराना हो सकता है, या सिर्फ पूरी तरह से गलत हो सकता है। उनके उदाहरण में उनके पास एक प्राथमिक कुंजी है जो एक विदेशी कुंजी भी है। – William

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