2016-08-02 166 views
0

我試圖更新我的數據庫,但它無法正常工作。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'])); 

因爲我沒有看到你使用這些ID其他地方。

+0

嗯ok,但是這並沒有解決我的問題 – utdev

+1

你正在更新數據庫行,其中product_id = 49,所以你正在更新所有的行......這可能不是你想要的。 –

+0

是的,你會如何解決這個問題? – 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); 
    } 
} 

的基本步驟定義是:

  • 獲取產品符合特定產品ID
  • 抓取所有已有的語言研究對於給定的產品
  • 比較輸入語言(短名稱)到不同語言
  • 待定:刪除輸入中未給出的每種語言
  • 遍歷輸入的短名
    • 的foreach短名取匹配的語言給定的product_id
    • 如果無法找到創建一個,否則更新現有
  • 移動文件(也可以檢查是否沒有任何改變 - 然後不要重新創建)
+0

對不起 - 不知道... –