2016-08-02 22 views
0

DBを更新しようとしていますが、正しく動作しません。Laravel更新メソッドが動作しない

更新メソッドを作成すると、問題はすべてのレコードをproduct_idで更新し続けますが、各レコードは更新する必要があることです。 私のdbに異なる値を持つインスタンス10のレコードがあります。

スクリプトを実行すると、すべてのレコードが入力フィールドから最初の値を取得します。

正しく動作させるにはどうすればよいですか?

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

どのように私のデシベルの小さなscretchは、次のようになります

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

がここ順序のように見える

がめちゃめちゃビットです

おそらく行うには意味:私はあなたが他のどこにも、これらのIDを使用して表示されていないので

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

 $productID = $data['id']; 

     $intProductID = intval($productID); 

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

と同じです。

+0

hmm okだが問題は解決しない – utdev

+1

product_id = 49のデータベース行を更新していますので、すべての行を更新しています...これはおそらくあなたが望むものではありません。 –

+0

ねえ、どうやってこれを解決しますか? – utdev

0

Iは再フォーマットされ、名前が変更され、再加工されました。

  • は、与えられた製品のすべての既存のlangages
  • は比較フェッチ与えられた製品ID
  • で製品を取得する:私の仮定は、基本的な手順がある非常にトップ

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

    でのコメントで定義されていますフェッチされた言語への言語(略称)の入力

  • tbd:入力に与えられていないすべての言語を削除する
  • 何も変わっていない場合は作成見つからない場合は、指定の入力の短い名前
    • foreachの短い名前フェッチマッチ言語による
    • ループはそう
  • 移動したファイルを既存の更新、
  • をPRODUCT_ID(もチェックすることができます - 次に再作成しないでください)
+0

ごめんなさい... –

関連する問題