2015-10-13 16 views
8

Propel ve Symfony2 formlarını kullanarak bir koleksiyon oluşturduk. Formu sorunsuz bir şekilde kaydedebiliriz ve koleksiyonu kullanarak ikinci bir seçenek ekleyebiliriz. O zaman kaydettikten sonra aşağıdaki hatayı alıyorum 3. bir koleksiyon eklemeye çalışırsanız: önemli sessiz olarak orada AncakSymfony2 + Propel Collection tanımsız offset: 2

Notice: Undefined offset: 2 

Stack Trace ben aşağıdaki ilgili kod gönderdiniz

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); 
     } 

kod miktarı. Biz de aynı sorunu yaşayan var mı diye merak ediyorduk.

Aynı hatayı oluşturan farklı bir kodla bir hata raporu gönderdim ancak yanıt almadım. Hata raporu here.

Aşağıda
<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> 

görünümüdür (herhangi bir stil olmadan):

{{ 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> 

Bu

ilgili şemanın snippet'idirBunu işleyen form:
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"; 
    } 

Son olarak, denetleyici aşağıdadır.

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

ve "BaseLabelsLabelsLinesMapsQuery.php" kodunuz nedir? – Alex

+0

@Alex Komut dosyasında birkaç satırlık çizgi olduğu için yapıştırdım. http://pastebin.com/WXgfN7yf. Lütfen bu kodun tamamen Propel tarafından üretildiğini unutmayın. –

cevap

1

Kişisel şema için biraz kafa karıştırıcı (yani ekleyerek istediğiniz buysa) Yalnızca bir birincil anahtar var ve daha sonra bu üç sütun üzerinde benzersiz dizin benzersizliği sağlamak için eğer

daha etkili olabilir ben mi. Eğer bir şey almak durumunda

<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> 

uzağa gidebilir Zahmetlerin bir sürü şüpheli ve: Bu biraz aşağıda üç ana yabancı anahtar olarak ikisi kullanarak anahtarları ve satır için benzersiz bir tanımlayıcı olarak bunlardan birini içerir onunla sopa. id'u kaldırın ve birincil kompozit anahtarınızı iki yabancı tabloyu temsil edin. Bu, tam olarak geçerli olan her yabancı tablonuzas değerini UNIQUE olarak değiştirir ve birincil anahtarınızı id olarak bırakır. Bu da tamamen geçerlidir.Sonuçta kararınız tasarım gereksinimlerinize dayanacaktır.

Başka bir not: Özellikle birincil anahtardaki bağımsız sütunlara başvuruyorsanız, heavyIndexing yapmak isteyebilirsiniz ya da olmayabilir. Kompozit bir birincil anahtar, her biri tek tek değil, her üç sütuna karşı bir dizin oluşturur. Bu, projenizde önemli olabilir veya olmayabilir, ancak dikkat etmem gerektiğini düşündüm.

+0

Merhaba, heavyIndexing'den söz ettiğiniz için teşekkür ederim. Aslında hiç kullanmadım ki, buna bir göz atacağım. Aslında, şu şema üzerinde ilerlemekteydim (propelorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-propel.html#many-tomanman-relations) Ancak, işaret ettiğin gibi. Kimlik aslında birçok şemada değil. Bunun, sorunun ana sebebi olabileceğine inanıyorum. Bir göz atacağım ve sana döneceğim. –

0

Bu konuda% 100 emin değilim, ama ben bu hat çünkü öyle eminim: öyle

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

Sen BaseQuery sınıfında yöntem findPkSimple fark edeceğiniz değişken anahtarın 3 değeri olan bir dizi olması beklenir (dizin 0, 1, 2)

Neden emin olmadığımın nedeni $ id'in yalnızca bir değer veya işlev tanımı olarak bir dizi olup olmadığını bilmem. türünü kısıtlamıyorsunuz. (editAction işleviniz)

Sanırım, üç ana anahtarınız olduğundan, oluşturulan sınıf birincil anahtarla arama yaparken üç ayrı değere sahip olmanızı bekler.

+0

Sadece $ id'in bir dizi değil, tek bir kimlik olduğunu açıklığa kavuşturmak için. Bir birincil anahtara sahip olduğumuz gibi. Aşağıdakileri (propelorm.org/documentation/cookbook/symfony2/mastering-symfony2-forms-with-propel.html#many-to-many-relations) birden çok birincil anahtarı gösteren bir şekilde aldım. Ancak bu örnekte kimlik aslında bu haritada değil. –

+0

Bu örneğin ya güncel olmayabilir ya da tamamen yanlış olabilir. Örneklerinde, aynı zamanda bir yabancı anahtar olan bir birincil anahtara sahipler. – William