Laravel在保存前生成鼻涕虫你有两种方式:在每种情况下,您都必须在类声明之前添加以下代码:

2022-08-30 20:12:24

我试图在这个wondefull网站的帮助下学习laravel 5。对于我的活动模型,我想在将一个 slug 保存到数据库之前生成一个 slug,因此我创建了以下模型。

<?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 , "-");
    }
    //    
}

但是当我在活动模型slug未填充的帮助下保存对象时,我尝试将其更改为$this->attributes['title'] = “test”进行测试,但它没有运行。另外,我尝试$title添加参数,$slug设置SlugAttribute(),但它没有帮助。

我做错了什么,有人可以解释一些例子中使用的参数,用于setSomeAttribute($whyParameterHere)。

注意:我的数据库中有一个 slug 字段。

正如user3158900所建议的那样,我试过了:

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

这使我的标题字段为空,但以我想要的方式保存了数据域,为什么$this>标题为空?如果我删除$this->标题= $title;标题和辅助信息都是空的


答案 1

我相信这不起作用,因为您没有尝试设置一个 slug 属性,以便该函数永远不会被击中。

我建议在你的函数中设置,这样它就会在你设置标题时运行。$this->attributes['slug'] = ...setTitleAttribute()

否则,另一种解决方案是在保存时为模型创建一个事件,该事件将在那里设置它。

编辑:根据评论,还需要在此函数中实际设置标题属性...

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

答案 2

你有两种方式:

1. 在控制器方法中添加 localy 此行:

$request['slug'] = Str::slug($request->title);

例:

//use Illuminate\Support\Str;

public function store(Request $request)
{
    $request['slug'] = Str::slug($request->title);

    auth()->user()->question()->create($request->all());
    return response('Created!',Response::HTTP_CREATED);
}

2. 将其添加到模型中,以便每次在 db 中保存时对其进行检查

//use Illuminate\Support\Str;

protected static function boot() {
    parent::boot();

    static::creating(function ($question) {
        $question->slug = Str::slug($question->title);
    });
}

例:

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use App\User;
use Illuminate\Support\Str;

class Question extends Model
{
    protected static function boot() {
        parent::boot();

        static::creating(function ($question) {
            $question->slug = Str::slug($question->title);
        });
    }

//The rest of methods

在每种情况下,您都必须在类声明之前添加以下代码:

use Illuminate\Support\Str;

推荐