Ankündigung

Einklappen
Keine Ankündigung bisher.

Laravel Eloquent - Probleme mit Timestamp bei Update (Patch)

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Laravel Eloquent - Probleme mit Timestamp bei Update (Patch)

    Hallo zusammen,

    wie auf der offiziellen Dokumentation von Eloquent (https://laravel.com/docs/5.7/eloquent) nachzulesen, erwartet Eloquent, dass in einer Tabelle die Felder "created_at" und "updated_at" existieren. Diese Spalten werden dann automatisch von Eloquent benutzt.
    Jetzt muss ich nur leider mit einer Datenbank arbeiten, in der die Tabellen die Felder "createdAt" und "updatedAt" heißen und nicht wie erwartet "created_at" und "updated_at".
    Also habe ich folgendes versucht, um Eloquent beizubringen, dass die Felder "createdAt" und "updatedAt" den Feldern "created_at" und "updated_at" entsprechen.

    PHP-Code:
    namespace App;

    use 
    Illuminate\Database\Eloquent\Model;

    class 
    Customer extends Model
    {
        const 
    CREATED_AT 'createdAt';
        const 
    UPDATED_AT 'updatedAt';

        protected 
    $dateFormat 'Y-m-d H:i:s.u';

    Beim Erstellen (Create) werden im richtigen Format (dateFormat) das createdAt und updatedAt Feld gefüllt. Das passt.
    Mache ich ein Update (Patch) bekomme ich immer folgende Meldung und der Datensatz wird nicht übertragen:

    HTML-Code:
    InvalidArgumentException
    
    Trailing data
    Was mache ich falsch, jemand eine Idee?

    Beste Grüße,
    Patrick


  • #2
    Um welche Datenbank handelt es sich? Und welche Felder updatest du, sicher dass es am timestamp liegt und nicht an einem anderen Feld? Und bitte mal die komplette DB Abfrage und Exception posten

    Kommentar


    • #3
      Hallo,

      es handelt sich um eine MSSQL-Datenbank.
      Mein Update sieht wie folgt aus:
      PHP-Code:
      public function update(Customer $customer) {        

              
      $customer->update([
                  
      '<field1>' => request('<field1>'),
                  
      '<field2>' => request('<field2>'),
                  ...
              ]);        

              return 
      redirect('<url>');

          } 
      Ich update 1 : 1 die gleichen Felder, wie beim Create (store). Dort funktioniert es wunderbar und die Felder "createdAt" und "updatedAt" werden automatisch im Format "Y-m-d H:i:s.u" gefüllt.
      Beim Update (Patch) wird immer eine Exception geschmissen:
      HTML-Code:
      InvalidArgumentException
      
      Trailing data
      Viellecht hilft das noch weiter, wird direkt nach der Exception angezeigt:

      // Carbon instances from that format. Again, this provides for simple date
      // fields on the database, while still supporting Carbonized conversion.
      if ($this->isStandardDateFormat($value)) {
      return Carbon::createFromFormat('Y-m-d', $value)->startOfDay();
      }

      // Finally, we will just assume this date is in the format used by default on
      // the database connection and use that format to create the Carbon object
      // that is returned back out to the developers after we convert it here.
      return Carbon::createFromFormat(
      str_replace('.v', '.u', $this->getDateFormat()), $value
      );
      }

      /**
      * Determine if the given value is a standard date format.
      *
      * @param string $value
      * @return bool
      */
      protected function isStandardDateFormat($value)
      {
      return preg_match('/^(\d{4})-(\d{1,2})-(\d{1,2})$/', $value);
      }

      /**

      Arguments

      • "Y-m-d H:i:s.u"

      • "2018-10-30 07:29:28.9722900"

      Beste Grüße,
      Patrick

      Kommentar


      • #4
        Ich habe eine Lösung gefunden:
        Bisher hat meine update-Funktion im Controller wie folgt ausgesehen:

        PHP-Code:
        public function update(Customer $customer) {
            ...
            
        $customer->update([
                ...
            ])

        Wenn der Kunde (Customer) direkt an die Funktion übergeben wird, kommt Eloquent nicht damit klar, dass Update-Datum selbst zu setzen (Fehler siehe im Beitragsverlauf).
        Übergebe ich jedoch die Id, anstatt den Kunden, an die Funktion update macht Eloquent genau das was es soll:

        PHP-Code:
        public function update($id) {
            ...
            
        Customer::where('id'$id)->update([
               ...
            ])
        ]) 
        Warum das ein Unterschied macht, weiß ich nicht. Auf jeden Fall funktioniert es so.

        Beste Grüße,
        Patrick

        Kommentar

        Lädt...
        X