2015-06-01 85 views
7

我試圖在this wondefull website的幫助下學習laravel 5。 對於我的活動模型,我希望在將一個節點保存到我的數據庫之前生成slu so,所以我創建了以下模型。Laravel在保存之前生成slu 012

<?php namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Activity extends Model { 

    protected $table = 'activitys'; 

    protected $fillable = [ 
     'title', 
     'text', 
     'subtitle' 
    ]; 

    // Here I want to auto generate slug based on the title 
    public function setSlugAttribute(){ 
     $this->attributes['slug'] = str_slug($this->title , "-"); 
    } 
    //  
} 

但是當我保存與活動模式塞的幫助對象沒有填充,我試了一下改變被$ this->屬性[「標題」] =「測試」進行測試,但它沒有運行。另外我嘗試添加參數$ title,$ slug到setSlugAttribute(),但它沒有幫助。

我在做什麼錯了,有人可以解釋在setSomeAttribute($ whyParameterHere)的一些例子中使用的參數。

注意:我的數據庫中有一個slug字段。

正如user3158900建議我已經試過:

public function setTitleAttribute($title){ 
    $this->title = $title; 
    $this->attributes['slug'] = str_slug($this->title , "-"); 
} 
// 

這使我的標題字段爲空,但節省了蛞蝓我想要的方式,爲什麼是$這個 - >標題空呢? 如果我刪除$ this-> title = $ title;標題和slu are都是空的

回答

13

我相信這是行不通的,因爲你不是試圖設置一個slug屬性,以便函數永遠不會被擊中。

我建議在你的setTitleAttribute()函數中設置$this->attributes['slug'] = ...,這樣它就會在你設置標題時運行。

否則,另一種解決方案是創建一個事件,保存您的模型,並將其設置在那裏。

編輯:根據意見,這還需要在實際這個功能設置標題屬性,以及...

public function setTitleAttribute($value) 
{ 
    $this->attributes['title'] = $value; 
    $this->attributes['slug'] = str_slug($value); 
} 
+0

在您的幫助下編輯問題。它由於某種原因使標題空着。如果我刪除$ this-> title = $ title;兩者都是空的。我仍然不明白參數 –

+0

$ this-> title = $ title;應該是$ this-> attributes ['title']現在可以正常工作! –

+0

使用Sluggable庫 –

2

您可以使用這個包,我使用https://github.com/cviebrock/eloquent-sluggable或檢查它如何應用觀察員對模型保存以及它如何生成一個獨特的Slug,然後執行相同的操作。

+0

str_slug($這個 - >標題, 「 - 」);工作正常。 –

1

你要設置的塞基於關閉標題時,標題屬性是組。

public function setTitleAttribute($value) 
{ 
    $this->attributes['title'] = $value; 
    $this->attributes['slug'] = str_slug($value); 
} 

/// Later that same day... 

$activity->title = 'Foo Bar Baz'; 

echo $activity->slug; // prints foo-bar-baz 

另一種方法是使用一個ModelObserver,聽節省事件。這將允許您在將模型寫入數據庫之前生成slug。

class ActivityObserver { 

    public function saving($activity) 
    { 
     $activity->slug = str_slug($activity->title); 
    } 
} 

在你可能想添加一些邏輯來測試,如果塞在數據庫中已存在這兩種情況下,添加一個遞增的號碼,如果它。即foo-bar-baz-2。這個邏輯最安全的地方是在ModelObserver中,因爲它在寫操作之前立即執行。

4

完成此操作的一種方法是掛入model events。在這種情況下,我們想要在創建時生成一個slu slu。

/** 
* Laravel provides a boot method which is 'a convenient place to register your event bindings.' 
* See: https://laravel.com/docs/4.2/eloquent#model-events 
*/ 
public static function boot() 
{ 
    parent::boot(); 

    // registering a callback to be executed upon the creation of an activity AR 
    static::creating(function($activity) { 

     // produce a slug based on the activity title 
     $slug = \Str::slug($news->title); 

     // check to see if any other slugs exist that are the same & count them 
     $count = static::whereRaw("slug RLIKE '^{$slug}(-[0-9]+)?$'")->count(); 

     // if other slugs exist that are the same, append the count to the slug 
     $activity->slug = $count ? "{$slug}-{$count}" : $slug; 

    }); 

} 

您還需要將以下添加到您的應用程序別名列表(app.php):

'Str' => Illuminate\Support\Str::class,