2016-08-02 5 views
0

Я пытаюсь обновить свой db, но он не работает должным образом.Метод обновления Laravel не работает

Я создаю метод обновления, проблема заключается в том, что он продолжает обновлять все записи с помощью product_id, тогда как он должен обновлять каждую запись. У меня есть, например, 10 записей с разными значениями в моем db.

Если я запустил сценарий, все записи получат первое значение из поля ввода.

Как я могу заставить его работать правильно?

Немного scretch о том, как мой дб, выглядит следующим образом:

id  |  product_id  |  short_name  |  input_video 
___________________________________________________________________________ 
1  |   49   |   de   |  c:\... 
2  |   49   |   en   |  c:\... 
3  |   49   |   tr   |  c:\... 
4  |   49   |   dr   |  c:\... 

Если я запускаю мой код (собирание де) это выглядит следующим образом:

id  |  product_id  |  short_name  |  input_video 
___________________________________________________________________________ 
1  |   49   |   de   |  c:\... 
2  |   49   |   de   |  c:\... 
3  |   49   |   de   |  c:\... 
4  |   49   |   de   |  c:\... 

код:

# save language selection 
    $lsCounter = 0; 
    $langSelecName = $request->input('language_selection'); 
    $langSelecFile = $request->file('language_selection'); 
    if($langSelecName) 
    { 
     $projectLangPath = $Path . "language"; 

     foreach($langSelecName as $langSelecNameKey => $langSelecNameValue) 
     { 
      if($langSelecFile[$lsCounter]['input_vid_lang'] != null) 
      { 
       $langVidFileName = $langSelecFile[$lsCounter]['input_vid_lang']->getClientOriginalName(); 

       $languages = new Language(); 
       $languages['short_name'] = $langSelecNameValue; 
       $languages['input_video'] = $projectLangPath . '\\' . $langVidFileName; 

       $languages->product()->associate($product); 

       $langSelecName = $request->input('language_selection'); 

       $langData = [ 
        'short_name' => $languages['short_name'], 
        'input_video' => $languages['input_video'] 
       ]; 

       $intProductID = intval($productID); 

       $findLang = $languages->where('product_id', $intProductID); 

       $productID = $data['id']; 

       if($findLang->update($langData)) 
       { 
        $langSelecFile[$lsCounter]['input_vid_lang']->move($projectLangPath, $langVidFileName); 
       } 
      } 

      $lsCounter++; 
     } 
    } 

Мое предложение where, вероятно, не так, но я не уверен, как его исправить.

Редактировать моя модель:

<?php 

    class Language extends Model 
    { 

     protected $table = 'products_languages'; 

     protected $fillable = ['product_id', 'short_name', 'input_video']; 

     public function product() 
     { 
      return $this->belongsTo('App\Product', 'product_id'); 
     } 

    } 

Редактировать

Вид:

  <fieldset class="form-group"> 
       <select class="form-control" id="language_selection" name="language_selection[]" multiple> 
        @foreach($languages as $languageKey => $languageValue) 
         <option value="<?php echo $languageValue->short_name; ?>"><?php echo $languageValue->name; ?></option> 
        @endforeach 
       </select> 
      </fieldset> 
      @if($type == "edit") 
       <input name="id" type="hidden" value="{{ $productId }}"> 
       @if($languagesCount > 0) 
        @foreach($languages as $languagesKey => $languagesValue) 
         <?php $i = 0 ?> 
          <span class="btn btn-primary btn-file lang-edit">{{ strtoupper($languagesValue->short_name) }}</span> 
         <?php $i++ ?> 
        @endforeach 
       @endif 
      @endif 
+0

Можете ли вы предоставить контент $ langSelecName? Также добавьте, что ваша языковая модель/класс? выглядит как. Почему у вас было short_name и input_video как ограничение ассоциативного массива, а не использование оператора объекта? –

+0

@Frank Provost Я получаю этот выходной массив: 1 [▼ 0 => «de» ] – utdev

+0

@FrankProvost Я добавил свою модель – utdev

ответ

0

Похоже порядка здесь немного перепутались:

 $intProductID = intval($productID); 

     $findLang = $languages->where('product_id', $intProductID); 

     $productID = $data['id']; 

Вы, вероятно, означает сделать:

 $productID = $data['id']; 

     $intProductID = intval($productID); 

     $findLang = $languages->where('product_id', $intProductID); 

который так же, как:

 $findLang = $languages->where('product_id', intval($data['id'])); 

Поскольку я не вижу вас, используя эти идентификаторы в другом месте.

+0

hmm ok, но это не решает мою проблему. – utdev

+1

Вы обновляете строки базы данных, где product_id = 49, поэтому вы обновляете все строки ... это, вероятно, не то, что вы хотите. –

+0

yep, как бы вы решили это? – utdev

0

Я переформатировал и переименовал и переработал много.Мои предположения определены в комментариях на самом верху

// $product_id = 1 
// $lang_select_name = ["TR"] => on create it was ["DE", "EN"] and is now updated with TR only 
// $lang_select_file = [<fileTR>] => on create it was [<fileDE>,<fileEN>] 
// $projectLangPath = '' // whatever your path is 

// first of all get the product 
$product = Product::find($product_id); 

// list all existing short_names for product id 
$existing = $product->languages->lists('short_name'); 

// tbd: delete every entry that is existing but not in $lang_select_name 

// loop through given input of names 
for($i = 0; $i < count($lang_select_name); $i++) 
{ 
    // check that file is not null => should be done in validation if required 
    if($lang_select_file[$i]['input_vid_lang'] != null) 
    { 
     // get the filename 
     $vid_name = $lang_select_file[$i]['input_vid_lang']->getClientOriginalName(); 

     // first check if the language entry exists already 
     $lang = Language::where('product_id', '=', $product_id)->where('short_name', '=', $lang_select_name[$i])->first(); 

     if(!$lang) { 
      // create it 
      $lang = Product->languages()->create([ 
       "product_id" => $product_id, 
       "short_name" => $lang_select_name[$i], 
       "input_video" => $projectLangPath . '/' . $vid_name 
      ]); 
     } else { 
      // update 
      $lang->input_video = $projectLangPath . '/' . $vid_name; 
      $lang->save(); 
     } 
     // move the file 
     $lang_select_file[$i]['input_vid_lang']->move($projectLangPath, $vid_name); 
    } 
} 

Основные шаги:

  • Fetch продукт с заданным идентификатором продукта
  • Fetch все уже существующие langages для данного продукта
  • Сравнить ввод языков (коротких имен) на языки с привязкой
  • tbd: удалить все языки, которые не указаны на входе
  • Петли через короткие имена входного
    • Еогеаспа короткого имя выборка языка соответствия для данной PRODUCT_ID
    • , если не удается найти создать, в противном случае обновлении существующего
  • переместить файл (можно также проверить, если ничего не изменилось - то не воссоздавать)
+0

извините - не знаю ... –

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