【问题标题】:Laravel Eloquent Model: Automatically create valuesLaravel Eloquent 模型:自动创建值
【发布时间】:2021-09-09 06:19:42
【问题描述】:

在我的应用程序中,我有一个模型,例如 Post 模型。每当有一个没有填满所有列的新条目时,我想计算剩余列的值。例如新帖子的标题是$post->title = 'Foo Bar',那么我希望slug 是$post->slug = 'foo-bar'自动

但是,我在哪里可以做到这一点?模型本身是否可以选择这样做?我真的不想在控制器中这样做。

【问题讨论】:

  • 您可以使用this 或使用任何event(取决于您希望它何时存在)
  • 看看 Spatie Sluggable 包,它处理创建和更新 slug 以及检查重复项。

标签: php laravel eloquent


【解决方案1】:

您可以使用Post 模型:

use Illuminate\Support\Str;

然后在 Post 模型中创建一个静态启动函数,如下所示:

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

    static::creating(function ($post) {
        $post->slug = Str::slug($post->title);
        // add other column as well
    });

    static::updating(function ($post) {
         $post->slug = Str::slug($post->title);
         // add other column as well
    });

}

【讨论】:

    【解决方案2】:

    我认为使用引导方法是一个很好的解决方案,另一种方法是使用模型observer。在 creating 事件中,您可以创建 slug 并保存它。

    <?php
    
    namespace App\Observers;
    
    use App\Models\Post;
    
    class PostObserver
    {
        /**
         * Handle the Post "creating" event.
         *
         * @param  \App\Models\Post  $Post
         * @return void
         */
        public function creating(Post $post)
        {
            $post->slug = Str::slug($post->title);
        }
    

    【讨论】:

      【解决方案3】:

      您可以在模型中为剩余的列定义一个 Mutator。

      文档https://laravel.com/docs/8.x/eloquent-mutators#defining-a-mutator

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

      您也可以为其他列定义这样的修改器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        相关资源
        最近更新 更多