2012-05-24 3 views
1

Я столкнулся с чем-то очень, очень странным. Работа в VirtualBox, Ubuntu, Apache2, PHP, MySQL У меня появилось очень странное поведение от одной конкретной модели.Yii очень странно save() поведение

Я хотел добавить возможность ввода нескольких языковых версий одной и той же строки, например название продукта. Я использовал jQuery для создания приятных вкладок с языками и создал временный массив для хранения всей этой информации, использовал виджет CActiveForm для сбора и представления данных.

<?php foreach($languages as $language): ?> 
    <div id="tab_<?=$language->code?>"> 
    <div class="row"> 
     <?php echo $form->labelEx($model,'name'); ?> 
     <?php echo $form->textField($model,"translations[$language->code][name]",array('size'=>60,'maxlength'=>128)); ?> 
     <?php echo $form->error($model,"translations[$language->code][name]"); ?> 
     </div> 
    </div> 
[...] 

Так вот как я собираю данные в массив $ translations. Это мой $ переводов массив:

$translations = array(
    'name' => 'NewName', 
    'sub_name' => 'Subname' 
); 

Тогда я явно присвоить его правильную модель в действии Controler:

[...] 
foreach ($translations as $key => $value){ 
    $x = new Translations(); 
    $x->language = $key; 
    $x->id = $product->id; 
    $x->name = $value['name']; 
    $x->sub_name = $value['sub_name'] 
    $x->save(); 
} 
[...] 

Теперь есть и другие поля, которые только один для каждого продукта:

[...] 
<div class="row"> 
    <?php echo $form->labelEx($model,'something'); ?> 
    <?php echo $form->textField($model,'something',array('size'=>60,'maxlength'=>128)); ?> 
    <?php echo $form->error($model,"something"); ?> 
    </div> 
</div> 

И те, которые хранятся просто

$product->save(); 

Все в аккуратной сделке.

ОДНАКО ....

Что я получаю в результате, как это (объединение по переводам и таблицы продукции):

id  name  subname  something 
1  NewN 
2  NewName  S 
3  NewName  Subname  Som 
4  NewName  Subname  Something 

4 записи, когда я добавить только один .... и многое другое текст, который я вложил, создано больше записей. Разделение случайным числом символов, иногда всего 4, иногда до 12. Это повторяемо, но не всегда ... Я полностью ошеломлен этим поведением.

Кто-нибудь когда-либо видел что-либо подобное и может пролить свет на него? Спасибо заранее!

+0

Можете ли вы показать запрос, который вы используете для получения «join on translations and product table», и как/где вы просматриваете результат? – DCoder

ответ

3

Проблема может быть поступающими на многих этапах:

  • форма
  • контроллер
  • связывания данных из формы в модели
  • спасительной модель (ActiveRecord)
  • или даже базы данных

Так что «разделите и покорите» ' твоя проблема.

MySQL

Включите «общий журнал тузд», чтобы увидеть запросы, которые посылаются в MySQL. Если они выглядят как странные формы, которые вы видите выше, то это не база данных. Маловероятно, что на этом этапе у вас возникнут проблемы, но хорошо это исключить.

ActiveRecord

Тогда жёстко свои значения в модели.В своем контроллере просто создайте экземпляр модели и сохраните ее. Реплицирует ли эта проблема у вас? Если это так, это проблема с вашей реализацией ActiveRecord. Попробуйте удалить отношения и поработать над этим.

Контроллер

Там может быть что-то странное в вашем контроллере. Снова, hardcode данные, которые вы хотите передать модели при создании экземпляра.

Связывание

Это может быть проблема с тем, как вы привязки данных из формы в модели. Вручную установите значения формы, а затем привяжите эти данные к модели как обычно.

Это то, что может помочь вам, если вы можете изолировать то, что работает от того, что нет. Посмотрите на инструменты, такие как Behat и PHPUnit.

+0

Человек, ты спаситель :). У меня запущен журнал mysql и кажется, что он генерирует правильные запросы ... Я имею в виду, что выполнено 3 запроса - один для добавления продукта, один для добавления двух разных переводов. Что это значит? MySQL как-то действует? – RandomWhiteTrash

+0

@RandomWhiteTrash Кажется, что ваши отношения настроены неправильно. Вернитесь к документации, заставьте ее работать на самом простом уровне. Используйте миграции для автоматизации воссоздания базы данных и вставьте некоторые приборы **, используя модель **. Продолжайте играть, пока не увидите, что светильники сохраняются должным образом. –

Смежные вопросы