[英]Symfony2 + Propel Collection undefined offset: 2
我們使用propel和Symfony2表單創建了一個集合。 我們可以毫無問題地保存表單,並且可以使用集合添加第二個選項。 如果然后保存然后嘗試添加第三個集合,則會出現以下錯誤:
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);
}
我已經在下面發布了相關的代碼,但是由於有大量的代碼安靜了下來。 我們想知道是否有人遇到過同樣的問題。
我已經用不同的代碼發送了一個錯誤報告,該錯誤創建了相同的錯誤,但是我沒有收到任何回復。 錯誤報告在這里 。
這是相關架構的片段:
<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()));
}
您的架構對我有些困惑。 下面的這一位包括三個主鍵,其中兩個作為外鍵,其中一個作為該行的唯一標識符:
<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
,要么將您的PRIMARY KEY
更改為每個外鍵上的UNIQUE
約束,而將主鍵保留為id
。 這也是完全有效的。 最終,您的決定將基於您的設計要求。
另一個注意事項:您可能會或可能不想執行heavyIndexing
,尤其是在引用主鍵中的各個列時。 復合主鍵針對所有三列創建索引,而不是分別針對每個列。 這在您的項目中可能重要,也可能不重要,但我認為值得指出。
我不太確定這一點,但我可以肯定是因為這條線:
$labels = LabelsQuery::create()->findPk($id);
您會在BaseQuery類的findPkSimple方法中注意到,期望變量鍵是一個具有3個值(索引0、1、2)的數組。
我不確定的原因是我不知道$ id是一個值還是一個數組,因為您擁有的函數定義不受類型的限制。 (您的editAction函數)
我認為,因為您有三個主鍵,所以生成的類期望在通過主鍵進行搜索時具有三個單獨的值。
如果您只有一個主鍵,然后在這三列上具有唯一索引以確保唯一性,則可能會更有效(如果您要這樣做)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.