2017-07-09 6 views
0

Ich lerne immer noch Laravel, und ich habe immer noch eine Sache, auf der ich feststecke. In meiner transactions Tabelle in meiner Datenbank, ich habe zwei Felder für eine polymorphe Beziehung:Laravel polymorphe Beziehungen und viele IFS

paymentable_id 
paymentable_type 

So kann ich ein Payment Plan oder ein Savings Plan oder ein anderes Modell hinzufügen, zu einer Transaktion.

Die Art, wie ich das mache, ist, indem ich ein paar Optionsfelder in meiner Ansicht habe, um auszuwählen, welches Modell hinzugefügt werden soll. Nachdem Sie eine Auswahl getroffen haben, erscheint ein Dropdown-Menü, in dem Sie auswählen können, welches hinzugefügt werden soll. Dies wird zum Beispiel ein Payment Plan ID senden.

In meinem Controller, ich bin Überprüfung dann, welche eingereicht wurde, und dann Anbringen dass ein meine Transaktion:

if ($request['plan_id']) 
{ 
    $plan = Plan::find($request['plan_id']); 

    $plan->transactions()->save($transaction); 
} 

if ($request['saving_id']) 
{ 
    $saving = Saving::find($request['saving_id']); 

    $saving->transactions()->save($transaction); 
} 

// And a couple more, for Fixed Payments, Subscriptions, Budgets, and so on. 

Und das ist, wo ich stecken bin, ich habe nicht die richtige Art und Weise kennen zu erreichen Dies, oder auch wenn polymorph ist der Weg dafür (ich bin mir ziemlich sicher, dass es aber ist). Ich mag 5+ if's in meinem Controller, oder irgendwo sonst, scheint mir falsch.

+0

Verwenden Sie plain html für Ihr Formular oder ist Javascript beteiligt? –

+0

Kein Javascript/Ajax beteiligt, nur HTML – Hardist

Antwort

1

Eine einfache Lösung, die jedoch möglicherweise nicht praktikabel ist, besteht darin, das Formular so zu ändern, dass zwei Werte übergeben werden: 'plan_type', 'plan_id'. Dann in Ihrem Controller, Sie überprüfen, welcher Plantyp angefordert wird, und verschieben zu sein Modell‘

$planType = "App\\" . $request['plan_type']; 

$plan = $planType::find($request['plan_id']); 

$plan->transactions()->save($transaction); 

Natürlich müssen Sie die Daten überprüfen und prüfen, ob der Typ vorgelegt existiert.

+0

Ich dachte über so etwas nach, während ich meine Frage schreibe, da ich ähnliche Lösungen für andere Dinge habe. Aber ich dachte, ich würde es lassen und sehen, was andere denken, und das ist in der Tat eine der einfacheren Möglichkeiten, damit umzugehen, also danke :) – Hardist

+1

Gern geschehen. Dies ist eine einfache Lösung. Aber es hängt von Ihren App-Anforderungen ab. Wenn Sie die Pläne beispielsweise anders behandeln möchten, funktioniert das nicht. Nehmen wir an, für Abonnements müssen Sie das Start- und Enddatum angeben. Dieser Wille wird zu vielen Wenns führen. Eine Lösung, die in den Sinn kommt, ist die Verwendung einer Fabrik, in der Sie die Anforderung übergeben und dort die Daten abhängig vom angeforderten Plantyp verarbeiten. – Hamoud

Verwandte Themen