代码之家  ›  专栏  ›  技术社区  ›  Ali

laravel模型中的自定义路径

  •  0
  • Ali  · 技术社区  · 7 年前

    我在laravel 5.5中有2个模型

    文章php 具有2个函数的类:

    public function sluggable()
    {
        return [
            'slug' => [
                'source' => 'title'
            ]
        ];
    }
    
    public function path()
    {
        return "/$this->slug";
    }
    

    类别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`
    

    但我想要这样的simething:

    实例com/parentCategory/subCategory-1//子类别-n/article\u slug

    我该怎么做 path() 作用有可能吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jack    7 年前

    我假设你的问题是,如何为类别生成uri,这些类别可以通过其slug生成无限数量的子元素。

    我将如何处理类似的问题,是在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 , _rgt parent_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
  •  0
  •   Rahmani Seif El Moulouk    7 年前

    你需要使用 Sluggable 在模型顶部的特征如下:

    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'
                ]
            ];
        }
    }