2016-06-28 2 views
0

Ein Benutzer fügt ein Einkommen oder Ausgaben. Wenn er es als wiederkehrende Transaktion klassifiziert, wählt er aus einem frequency_dropdown, der (wöchentlich, vierzehntägig, monatlich) enthält. Der Benutzer gibt auch das Startdatum ein. Ich möchte die Daten für die ausgewählte Frequenz ab dem Datum, das der Benutzer angibt, erhalten.Möglichkeit, Daten für wöchentlich, vierzehntägig und monatlich zu erhalten

Zum Beispiel, die Benutzereingaben 06-13-2016 und wöchentlich (aktuelles Datum: 28.06.2016), würde ich gerne die Daten 06-20-2016 und 06-27-2016 bekommen.

HTML Dropdown

<select name="frequency_id"> 
    <option value="1">weekly</option> 
    <option value="2">fortnightly</option> 
    <option value="3">monthly</option> 
</select> 

-Controller

public function getDates($frequency, $start_date) { 
    //$start_date is string e.g 06-23-2016 
    //$frequency is also string e.g weekly, fortnightly, monthly 
    ... 
    ... 
    return $dates; //array returned 
} 

Es ist in Ordnung, wenn ich die Zeichenfolge Datum Datetime-Objekt konvertieren, solange ich die Daten erhalten.

Ich möchte die Daten in einer Reihe von Daten oder ähnlichem erhalten.

Ich habe keine Ahnung, wie ich damit fortfahren soll. Bitte helfen Sie.

+0

Was ist der Datentyp von start_date? DateTime-Objekt? Schnur? In welcher Variable haben Sie die Wiederholung? Ist es eine Schnur? Könnten Sie etwas mehr Code bereitstellen (einschließlich des HTML-Dropdown-Menüs, ... usw.)? Erwarten Sie, dass das Ergebnis eine Zeichenfolge, ein Array aus Zeichenfolgen, DateTime-Objekten ... ist? – trincot

+0

@trincot done bearbeiten –

Antwort

1

Sie werden Carbon für diese Aufgabe verwenden möchten. Es ist bereits in Laravel enthalten. :)

Lassen Sie uns Code ein Helfer außerhalb der Steuerung diese Aufgabe zu machen:

app/Helpers/DateHelper.php (erstellen Sie einfach diese Datei)

<?php 
namespace App\Helpers; 

class DateHelper 
{ 
    public static function next_dates($start_date, $frequency) 
    { 
     $dates = []; 

     $start_date = Carbon::createFromFormat('m-d-Y', $start_date); 
     $end_date = Carbon::today(); 

     while ($start_date->lte($end_date)) { 
      switch ($frequency) { 
       case 'weekly': 
        $start_date = $start_date->addWeek(); 
        break; 
       case 'fortnightly': 
        $start_date = $start_date->addWeeks(2); 
        break; 
       case 'monthly': 
        $start_date = $start_date->addMonth(); 
        break; 
      } 

      if ($start_date->lte($end_date)) { 
       $dates[] = $start_date->format('m-d-Y'); 
      } 
     } 

     return $dates; 
    } 
} 

In Ihrem Controller, nur verwenden der Helfer:

<?php 
namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Illuminate\Routing\Controller; 
use App\Helpers\DateHelper; 

class YourController extends Controller 
{ 
    public function index(Request $request) 
    { 
     $dates = DateHelper::next_dates(
      $request->input('start_date'), 
      $request->input('frequency') 
     ); 

     return view('your-view')->with(compact('dates')); 
    } 
} 
+0

beim Hinzufügen eines Monats, wie verhält es sich? Beispiel 6-23-2016, wenn ein Monat hinzugefügt wird, möchte ich den 23.07.2016 erhalten. gleicher Tag. –

+0

oder wie wäre es mit 31-31-2016. Juni endet nur bei 30 –

+0

Was willst du? Für die wöchentliche Frequenz hast du gesagt, dass es bis zum aktuellen Datum anhalten soll. Die Anforderungen sind nicht klar, wie viele Daten Sie für jede Frequenz erwarten. Hast du ein Enddatum? –

0

Sie so etwas wie dies nutzen könnten:

function getDates($frequency, $start_date, $end_date = null) { 
    //$start_date is string e.g 06-23-2016 
    //$frequency is also string e.g weekly, fortnightly, monthly 
    //$end_date is optional string: limit to the dates to be generated. Default = today 

    // Convert to use slashes, so PHP will interpret in m/d/Y format, 
    // otherwise it would expect d-m-Y. 
    $dt = new DateTime(str_replace("-", "/", $start_date)); 
    $dtUntil = new DateTime(str_replace("-", "/", $end_date ? $end_date : date("m-d-Y"))); 
    // conversion table: frequency to date modifier string 
    $modifiers = [ 
     "weekly" => "+1 week", 
     "fortnightly" => "+2 weeks", 
     "monthly" => "+1 month" 
    ]; 
    $modifier = $modifiers[$frequency]; 
    $dt->modify($modifier); 
    while($dt <= $dtUntil) { 
     $dates[] = $dt->format("m-d-Y"); 
     $dt->modify($modifier); 
    } 
    return $dates; //array returned 
} 

Beispielaufruf:

$dates = getDates("weekly", "06-13-2016", date("m-d-Y")); 

Sie müssen etwas schaffen, um das Array zu beenden, so habe ich das Enddatum versehen, bis zu dem auf erzeuge Daten als dritten Parameter der Funktion. Wenn Sie es nicht angeben, wird es standardmäßig auf den heutigen Tag gesetzt, so dass es im obigen Beispiel weggelassen werden könnte.

Lassen Sie es laufen auf eval.in.

+0

anstelle der Zählung, kann es nur bis zum aktuellen Datum (heute) stoppen? Zum Beispiel ist heute der 28.06.2016. so wird es nur 6-20-2016 und 6-27-2013 zurückgeben. Es wird nicht 7-05-2016 enthalten, da es über dem aktuellen Datum liegt. –

+0

Sicher, ich habe meine Antwort aktualisiert. Das dritte Argument ist das Enddatum. Pass heute als Argument auf, um zu bekommen, was du gerade gesagt hast. – trincot