【问题标题】:Don't change slug on update (In Laravel Model)不要在更新时更改 slug(在 Laravel 模型中)
【发布时间】:2016-09-24 18:52:20
【问题描述】:

我有一个名为Oglas 的模型,我用它在表中创建行。它为该行创建了一个唯一的 slug,但是每当我更新该行时,它都会生成新的 slug。因此,当有人分享帖子然后进行编辑时,该分享的帖子将不再存在,因为 slug 已更改。

这里是代码Oglas

    class Oglas extends Model
    {
        protected $table = "oglasi";
        protected $guarded = ['id'];

        public function uniqueSlug($title) {
            $slug = str_slug($title);
            $exists = Oglas::where('slug', $slug)->count();

            if($exists > 0)
                $slug .= "-" . rand(11111, 99999);

            return $slug;
        }

        public function setNazivAttribute($value) // In table i have "naziv" column
        {
            $this->attributes['slug'] = $this->uniqueSlug($value); // I do not want this to fire if post is edited.
            $this->attributes['naziv'] = $value;
        }



}

总结一下:当创建新帖子时触发创建 slug,更新(编辑)时不触发,不要更改 slug。

【问题讨论】:

  • 您创建和更新模型的方法是什么。我的意思是你的控制器的代码。你能告诉我们吗?

标签: laravel laravel-4 laravel-5 laravel-5.1 laravel-5.2


【解决方案1】:

为此使用 laravel 的 create 方法,这样更新不会触发。或者使用雄辩的查询来创建。这也将保护唯一行的更新。

【讨论】:

  • 这是模型。所以我使用了 create 并且这会触发。我使用了更新,这会触发
  • 在创建前使用验证方法,其中定义唯一列的规则。并验证您的输入值。
【解决方案2】:

看起来 eloquent 模型 events 是解决您问题的好方法,如果您只想在创建帖子时创建 slug,您可以使用 creating 事件。

在您的 Oglas.php 上定义它:

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

    static::creating(function ($oglas) {
        $oglas->slug = $this->uniqueSlug($this->naziv);
    });
}

或者你可以在你身上定义它AppServiceProvider.php:

public function boot()
{
    ....

    Oglas::creating(function ($oglas) {
        $oglas->slug = $oglas->uniqueSlug($oglass->naziv);
    });
}

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2015-04-24
    • 2017-05-09
    相关资源
    最近更新 更多