2016-07-31 30 views
0

Bisher habe ich hier Antworten gefunden und musste nie etwas fragen. Aber dieses Problem nervt mich wirklich. Hier ist die Situation. Ich habe ein dynamisches Rechnungsformular. Beiträge aus dem Formular wird an zwei verschiedenen TabellenLaravel 5.2 Einfügen und Aktualisieren von Daten aus dynamischem Formular

  1. Rechnungen
  2. InvoiceItems (invoice_id, ItemDescription, Menge, Preis, (wo Details für Rechnung wie member_id, Rabatt, duedate, Anmerkungen und die Zeitstempel gespeichert wird) gespeichert werden Zeitstempel)

um dies zu erreichen, hier ist meine Methode zu speichern Rechnung

public function store(InvoiceRequest $request) 
{ 

//get necessary details for invoice table 
$datainvoice = array(
'member_id' => $request->input('member_id'), 
'duedate' => $request->input('duedate'), 
'discount' => $request->input('discount'), 
'remarks' => $request->input('remarks'), 
//'gtotal' => $request->input ('gtotal'), 
); 

//save result of invoice 
$resultforinvoice = Invoice::create($datainvoice); 


// ready all data of invoice items 
$datainvoiceitem = array(
'description' => $request->input('description'), 
'rate' => $request->input('rate'), 
'quantity' => $request->input('quantity'), 
'invoice_id' => $resultforinvoice->id, 
); 


// insert invoice along with invoice_id 
Invoiceitem::create($datainvoiceitem); 
return redirect('members'); 

} 

Weitere Informationen :

Beziehung zwischen den Mitgliedern und Rechnungen :: Mitglied-has-many-Rechnungen, Rechnungs gehört-zu-Single-Mitglied

Beziehung zwischen Rechnung und InvoiceItems :: Rechnung-has-many-Artikel, ein-Punkt-gehört-zu-eins-Rechnung

Teil der dynamischen Form:

<td> 1 </td> 
<td><textarea type="text" name='description[0][description]' class="form-control"/></textarea> </td> 
<td><input type="text" name='quantity[0][quantity]' class="form-control"/></td> 
<td> <input type="text" name='rate[0][rate]' class="form-control"/> </td> 

Fehler im, jetzt Argument 1 bestanden Empfang \ Database \ Grammatik Illuminate :: parametrieren() müssen von der Typ Array, in Teger gegeben, in C genannt: \ xampp \ htdocs \ Studie \ Anbieter \ Laravel \ Framework \ src \ Illuminate \ Database \ query \ Grammatiken \ Grammar.php auf der Leitung 719 und definiert

aktualisieren

wenn ich versuche, die Eingänge zurück für InvoiceItems, was los ist zu prüfen, erhalte ich ein Array wie unten

{ 
"description": [ 
{ 
    "description": "desc1" 
}, 
{ 
    "description": "desc2" 
} 
], 
"rate": [ 
{ 
    "rate": "11" 
}, 
{ 
    "rate": "22" 
} 
], 
"quantity": [ 
{ 
    "quantity": "1" 
}, 
{ 
    "quantity": "2" 
} 
], 
"invoice_id": 41 

} 

Jungs, bitte sagen lassen Sie mich wissen, wo im fehlt. Ich habe versucht, dies auch in Laracast zu fragen, es ist im Moment einige Stunden nichts gewesen, hoffentlich wird mir jemand die richtige Richtung zeigen. Here is the laracast link.

+0

Nach Ihren Eingaben Namen '$ Anfrage-> Eingabe ('Beschreibung')' gibt ein Array statt eines einzelnen Wertes. Und danach versuchen Sie, dieses Array als Spaltenwert zu speichern. Ich bin mir nicht sicher, aber ich denke das ist dein Problem. – Phargelm

+0

@Phargelm Ich versuche, dies mit Hilfe von transpose() zu sortieren, ich werde dies aktualisiert haben, sobald ich einen funktionierenden Code habe – ashish

+0

@Phargelm im Anschluss an ein Tutorial [link] (https://adamwathan.me/2016/04/06/ cleaning-up-form-input-with-transpose /) Nun, ich bekomme das Array richtig, aber ich möchte zusätzliche Informationen hinzufügen, sagen Rechnung_id im Array. Würdest du mich in die richtige Richtung weisen? Ich aktualisiere meine Sachen hier, [link] (https://laracasts.com/discuss/channels/eloquent/inserting-and-updating-data-from-dynamic-form-properly) – ashish

Antwort

0

ich Aktualisierung Mehrheit des Codes beendet und jetzt sieht es aus wie dieses

$items = []; 
    foreach ($request->items as $field => $values) { 
     foreach ($values as $index => $value) { 
      $items[$index][$field] = $value; 
     } 
    } 


    Invoice::create($invoice) 
     ->invoiceitem()->createMany($items); 

und es funktionierte einfach. Lass mich wissen, dass jemand anderes Hilfe braucht.Ich würde gerne erklären

+0

Wie haben Sie das Update gelöst? – lewis4u

+0

So habe ich es gemacht! 'foreach ($ Artikel als $ Artikel) { $ Rechnung-> Rechnungsartikel() -> updateOrCreate (['id' => $ item ['id']], $ item); } ' – ashish

+0

Und was ist, wenn Sie einige alte löschen und neue hinzufügen – lewis4u

0

Darf ich vorschlagen,

public function store(InvoiceRequest $request) 
{ 
    $invoice_fields = ['member_id', 'duedate', 'discount', 'remarks', 'gtotal']; 

    $items = []; 

    foreach ($request->items as $field => $values) { 
     foreach ($values as $index => $value) { 
      $items[$index][$field] = $value; 
     } 
    }   

    Invoice::create($request->only($invoice_fields)) 
     ->items()->createMany($items); 

    return redirect('members');  
} 

(Wenn Sie die Beziehung richtig eingerichtet ist, müssen Sie nicht manuell die invoice_id jedem Element zugeordnet werden, müssen nur die Rechnung create das Item).


Sie können abstrahieren foreach s in einem separaten Verfahren kann eine Sammlung Makro eine gute Idee, wie das Tutorial schlägt vor (obwohl ich es anders umzusetzen; mein Vorschlag nicht Indexzahlen in der ursprünglichen HTML benötigen) . Der HTML-Code für das Formular aussehen sollte

<input type="text" name="items[description][]"> 
<input type="text" name="items[quantity][]"> 
<input type="text" name="items[rate][]"> 

<input type="text" name="items[description][]"> <!-- as many of --> 
<input type="text" name="items[quantity][]">  <!-- these  --> 
<input type="text" name="items[rate][]">   <!-- as needed --> 
+0

Dies würde wirklich die ganze Sache vereinfachen, die Aktualisierung Form wäre viel einfacher, aber eine Sache, da wir den Namen Formularfelder als Elemente verwenden [Beschreibung] [], ohne Indexierung, wie validieren wir das Formular? Kannst du mir eine Idee geben? – ashish

+0

NIEMALS !! Gelöst IT: P im werde die ganze Sache posten, wenn ich fertig bin !! – ashish