2016-06-24 10 views
0

ich zur Zeit einen Blog erschaffe, wo jede Beitrag Zeile in meiner Datenbank ein eindeutiges Hash Attribut hat, die von der Post-ID basierte (Erhöhen, immer einzigartig).Laravel 5.2 - Mit SetIdAttribute() Mutator Anderen Werten einstellen

Das ist mein Beitrag Modell

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 
use Hashids; 

class Post extends Model 
{ 
    public function setTitleAttribute($value) 
    { 
    $this->attributes['title'] = $value; 

    if (! $this->exists) { 
     $this->attributes['slug'] = str_slug($value); 
    } 
    } 

    public function setIdAttribute($value) { 
    $this->attributes['id'] = $value; 
    $this->attributes['hash'] = Hashids::encode($value); 
    } 
} 

Wenn ich laufen diese Fabrik

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    return [ 
     'title' => $faker->sentence(mt_rand(3, 10)), 
     'content' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))), 
     'author' => $faker->name, 
     'category' => rand(1, 20), 
    ]; 
}); 

Der setIdAttribute ($ value) Funktion aufgerufen wird immer, aber meine Hash-Attribut ist nicht gesetzt werden. Ich bin mir nicht sicher, ob es überschrieben wird oder was.

Wenn ich die Linie

$this->attributes['hash'] = Hashids::encode($value); 

auf die Funktion

public function setTitleAttribute($value) 

und kodieren den Titel bewegen Attribut es funktioniert gut, aber ich möchte das Attribut ‚id‘ codieren. Irgendeine Idee, wie ich das machen würde?

Antwort

2

Sie folgendes zu Ihrem Modell hinzufügen:

/** 
* Events 
*/ 
public static function boot() 
{ 
    parent::boot(); 

    static::created(function($model) 
    { 
     $model->hash = Hashids::encode($model->id); 
     $model->slug = str_slug($model->title); 
    } 
} 
+0

änderte es das Modell zu dieser (http: // i.imgur.com/ivZFYCy.png), und jetzt werden der Hash und der Slug nicht gesetzt – StackOverflower

+0

Ich dachte mir, dass ich $ modell-> save() hinzufügen musste; bis zum Ende der Aufgaben – StackOverflower

1

Es ist wahrscheinlich setIdAttribute($value) wird nicht aufgerufen, bis die Einfügung ausgeführt wird, weil es die ID bis dahin nicht kennt.

Das eigentliche Problem ist, Sie können einen Hash der id in der gleichen Abfrage nicht festlegen, da die id wird nicht bekannt sein (vorausgesetzt, es ist auto_incrementing) bis nach der Einfügung.

Aus diesem Grund ist das beste, was Sie wahrscheinlich tun können, hier ist ein Code auf dem Modell saved Event feuern.

In diesem Modell können Sie wahrscheinlich etwas tun, wie ...

public static function boot() 
{ 
    parent::boot(); 
    static::flushEventListeners(); // Without this I think we have an infinite loop 
    static::saved(function($post) { 
     $post->hash = Hashids:encode($post->id); 
     $post->save(); 
    }); 
}