2016-03-03 2 views
5

Ich möchte ein Feld (status) auf dem Modell aktualisieren. Ich würde von DB abrufen und der Spalte status einen neuen Wert zuweisen. Aber nachdem das Modell gespeichert wurde, sah ich ein anderes Datumsfeld (published_at), das ebenfalls auf updated_at geändert wurde. Die Aktion wird ausgeführt, wenn Benutzer auf einen Link als http://localhost/dashboard/gallery/publish/1 klicken.Warum aktualisiert Laravel 5 automatisch mein Datumsfeld?

Ich weiß nicht, warum die published_at automatisch aktualisiert und das selbe wie updated_at?

Hier ist Controller-Code:

<?php 
class GalleryController extends Controller 
{ 
    /** 
    * Approve to publish the gallery on the web. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function getPublish($id) 
    { 
     $gallery = Gallery::whereId($id)->firstOrFail();  
     $gallery->status = Gallery::STT_PUBLISH; 
     $gallery->save(); 
     return redirect(route('backend::gallery.edit',[$gallery->id]))->with('status', 'Done'); 
    } 
} 
?> 

und Galerie Modell:

<?php 
namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class Gallery extends Model 
{ 
    use SoftDeletes; 
    protected $table = 'gallery'; 
    protected $fillable = ['title', 'slug', 'content', 'category_id', 'type']; 
    protected $guarded = ['published_at','creator_id','thumbnail']; 
    protected $dates = ['deleted_at', 'published_at']; 
} 
?> 

und Migration func:

public function up() 
    { 
     Schema::create('gallery', function (Blueprint $table) { 
      $table->increments('id')->unsigned(); 
      $table->string('slug')->unique(); 
      $table->tinyInteger('type')->unsigned(); 
      $table->integer('category_id')->unsigned()->default(0); 
      $table->string('thumbnail'); 
      $table->string('title'); 
      $table->text('content'); 
      $table->integer('status')->unsigned()->default(0); 
      $table->timestamp('published_at'); 
      $table->integer('creator_id')->unsigned(); 
      $table->timestamps();    
      $table->index(['slug']); 
      $table->softDeletes(); 
     }); 
     Schema::table('gallery', function (Blueprint $table) { 
      $table->foreign('category_id')->references('id')->on('category'); 
      $table->foreign('creator_id')->references('id')->on('users'); 
     }); 
    } 

UPDATE

Ich sehe das config in Migration Funktion Problem macht, hier: $table->timestamp('published_at');

Und diese Anweisung erstellt SQL wie folgt aus:

CREATE TABLE `gallery` ( 
    ... 
    `published_at` Timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    ... 
) 

So, wie ein Zeitstempel-Feld einrichten , das ist nicht automatische Aktualisierung der aktuellen Zeit?

UPDATE 2

Erledigt, ändere ich die Migration, benutzen Sie einfach dateTime statt timestamp.

Verwenden Sie es, $table->dateTime('published_at');, diese Anweisung wird nicht automatisch auf CURRENT_TIMESTAMP aktualisieren.

+0

versuchen Sie dies, entfernen Sie "published_at" aus $ dates – SarangaR

+0

@SarangaR Ich versuchte es vorher, aber es ist nicht getan – Davuz

+0

@TimothyKruger Ich stimme über Timestamp Problem aber nicht updated_at oder deleted_at. Bitte beachten Sie mein Update der Frage. Vielen Dank! – Davuz

Antwort

3

Es sieht so aus, als würde MySQL (oder die von Ihnen verwendete Datenbank) das Datum aktualisieren, nicht Laravel.

Sie müssen sich ändern:

$table->timestamp('published_at'); 

zu:

$table->dateTime('published_at'); 

dann eine php artisan migrate:refresh Ihre Tabellen rückgängig zu machen und neu zu erstellen.

+0

(y) Ich sah, dass <3 – Davuz

+0

Just versuchte es, das tut nichts . – Cosmin

+0

Lösung ist hier - https://Stackoverflow.com/a/46620583/1828637 – Noitidart

-1

Alternative Lösung ist, eine Migration zu erstellen, die diese Abfrage ausführen, um die ON UPDATE-Trigger der Säule zu entfernen:

ALTER TABLE queued_posts CHANGE scheduled_publish_time scheduled_publish_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

2

Dieser Beitrag ist alt, aber für jeden, der dieses Problem hier bekam ist die einfachste Lösung . In Ihrer Migration muss das Timestamp-Feld nur nullfähig sein. Dann wird in diesem Feld kein automatischer Update-Trigger ausgelöst.

$table->timestamp('published_at')->nullable(); 

Keine Notwendigkeit für $table->dateTime() statt $table->timestamp() verwenden.

+0

Oh mein Gott vielen Dank für das Teilen dieser Lösung! Dies sollte die akzeptierte Antwort sein! – Noitidart