【问题标题】:custom path in laravel modellaravel 模型中的自定义路径
【发布时间】:2017-11-22 05:54:46
【问题描述】:

我在 laravel 5.5 中有 2 个模型

Article.php 类具有 2 个功能:

public function sluggable()
{
    return [
        'slug' => [
            'source' => 'title'
        ]
    ];
}

public function path()
{
    return "/$this->slug";
}

Category.php

public function childs() {
      return $this->hasMany('App\Category','parent_id','id') ;
}

类别表:

id /  article_id  / parent_id / name

现在例如,查看此代码:{{ $article->path() }}

it prints:  `example.com/article_slug`

但我想要这样的东西:

example.com/parentCategory/subCategory-1/.../subCategory-n/article_slug

如何在path() 函数中做到这一点?有可能吗?

【问题讨论】:

    标签: php laravel-5 laravel-routing


    【解决方案1】:

    我假设您的问题是询问如何为可以通过它们的 slug 拥有无限数量的孩子的类别生成 uri。

    我将如何解决此类问题是通过在 MySQL 中使用分层数据模式,这将允许您通过执行一个查询来获取后代/祖先的列表。有很多方法可以实现这一点,但出于解释的目的,我将解释如何使用嵌套集合模式来实现。更具体地说,我将演示如何使用lazychaser 的嵌套集package 来做到这一点。

    类别表迁移

    use Kalnoy\Nestedset\NestedSet;
    
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        NestedSet::columns($table);
        $table->timestamps();
    });
    

    嵌套的集合列会将_lft_rgtparent_id 列添加到您的表中。我建议您对嵌套集模型的工作原理进行一些研究,以了解左右列的用途。

    类别模型

    use Kalnoy\Nestedset\NodeTrait;
    
    class Category extends Model
    {
        use NodeTrait;
    
        //
    }
    

    现在您可以像这样创建一个子类别:

    $parentCategory = Category::first();
    
    $parentCategory->children()->create([
        'name' => 'Example Category'
    ]);
    

    这意味着在深度嵌套的类别上,您可以:

    $categories = Category::ancestorsAndSelf($article->category_id);
    

    这将返回上述类别的所有祖先,然后要获取 uri,您可以执行以下操作:

    $uri = $categories->pluck('slug')->implode('/') . '/' . $article->slug;
    

    【讨论】:

      【解决方案2】:

      您需要在模型顶部使用SluggableTrait,如下所示:

      use Cviebrock\EloquentSluggable\Sluggable;
      
      class Post extends Model
      {
          use Sluggable;
      
          /**
           * Return the sluggable configuration array for this model.
           *
           * @return array
           */
          public function sluggable()
          {
              return [
                  'slug' => [
                      'source' => 'title'
                  ]
              ];
          }
      }
      

      【讨论】:

      • 我现在可以使用 slug 和 slug 作品了。请再次阅读我的问题。我想知道如何在路径中插入相关类别?
      猜你喜欢
      • 2016-09-12
      • 2020-11-08
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多