2015-06-01 8 views
7

Im пытается узнать laravel 5 с помощью this wondefull website. Для моей модели деятельности я хочу сгенерировать пули, прежде чем сохранять ее в моей базе данных, поэтому я создал следующую модель.Laravel генерировать слизь перед сохранением

<?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).

Примечание: в моей базе данных есть пустое поле.

Как было предложено user3158900 я попытался:

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

Это делает мое название поле пустым, но спасает слизняк, как я хочу его, почему $ this-> название пустого тогда? Если я удалю $ this-> title = $ title; оба названия и пули пустые

ответ

13

Я считаю, что это не работает, потому что вы не пытаетесь установить атрибут slug, чтобы функция никогда не попадала.

Я предлагаю установить $this->attributes['slug'] = ... в вашей функции setTitleAttribute(), поэтому он запускается всякий раз, когда вы устанавливаете заголовок.

В противном случае другим решением было бы создать событие для сохранения вашей модели, которое установило бы его там.

Edit: Согласно комментариям, это также необходимо, чтобы фактически установить атрибут заголовка в этой функции, а также ...

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 ($ this-> название, "-"); работает отлично. –

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 и слушать экономии событие. Это позволит вам генерировать слизню прямо перед записью модели в базу данных.

class ActivityObserver { 

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

В обоих случаях вы, вероятно, хотите, чтобы добавить некоторую логику, чтобы проверить, если пробкового уже существует в БД, добавив номер Инкрементирование если он делает. т.е. foo-bar-baz-2. Самое безопасное место для этой логики будет в ModelObserver, поскольку оно выполняется непосредственно перед действием записи.

4

Один из способов добиться этого - подключить к model events. В этом случае мы хотим сгенерировать slug на , создавая.

/** 
* 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, 
Смежные вопросы