2016-08-02 23 views
0

Ich versuche, meine db zu aktualisieren, aber es funktioniert nicht richtig.Laravel Update-Methode funktioniert nicht

Ich baue eine Update-Methode, das Problem ist, dass es aktualisiert alle Datensätze mit der Produkt-ID, während es jeden Datensatz aktualisieren sollte Ich habe zum Beispiel 10 Datensätze mit unterschiedlichen Werten in meiner Datenbank.

Wenn ich das Skript ausführen, erhalten alle Datensätze den ersten Wert aus dem Eingabefeld.

Wie kann ich sicherstellen, dass es richtig funktioniert?

Ein wenig scretch, wie meine db, sieht wie folgt aus:

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

Wenn ich meinen Code (Kommissionierung de) laufen sieht es wie folgt aus:

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

Code:

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

Meine Where-Klausel ist wahrscheinlich nicht richtig, aber ich bin mir nicht sicher, wie es zu beheben ist.

bearbeiten mein Modell:

<?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'); 
     } 

    } 

bearbeiten

Ausblick:

  <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

Können Sie den Inhalt $ langSelecName angeben? Bitte fügen Sie auch Was Ihr Sprachmodell/Klasse? sieht aus wie. Warum haben Sie short_name und input_video als assoziative Array-Constraints verwendet und keinen Objektoperator verwendet? –

+0

@Frank Provost Ich bekomme diese Ausgabe Array: 1 [▼ 0 => "de" ] – utdev

+0

@FrankProvost Ich habe mein Modell hinzugefügt – utdev

Antwort

0

wie die Reihenfolge Sieht hier ist ein bisschen durcheinander:

 $intProductID = intval($productID); 

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

     $productID = $data['id']; 

Sie meinen wahrscheinlich zu tun:

 $productID = $data['id']; 

     $intProductID = intval($productID); 

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

, die die gleiche wie:

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

Da ich Sie nicht sehen, nirgendwo sonst diese IDs verwenden.

+0

hmm ok, aber das löst mein Problem nicht – utdev

+1

Sie aktualisieren die Datenbankzeilen, wo product_id = 49, so dass Sie alle Zeilen aktualisieren ... das ist wahrscheinlich nicht das, was Sie wollen. –

+0

yep, wie würdest du das lösen? – utdev

0

Ich umformatiert und umbenannt und überarbeitet viel.Meine Annahmen werden in den Kommentaren definiert an der Spitze

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

Die grundlegenden Schritte sind:

  • Fetch Produkt mit bestimmten Produkt-ID
  • Liefert alle bereits vorhandenen langages für bestimmtes Produkt
  • vergleichen Eingabe von Sprachen (Kurznamen) in Feched-Sprachen
  • tbd: lösche jede Sprache, die nicht in der Eingabe
  • angegeben ist
  • Schleife durch Kurznamen der Eingangs
    • foreach Kurzname Abrufen passende Sprache für gegebene product_id
    • wenn nicht gefunden erstellen können, sonst aktualisieren bestehende
  • Verschieben Sie die Datei (könnte auch prüfen, ob sich nichts geändert - dann nicht neu erstellen)
+0

Entschuldigung - keine Ahnung ... –