diff --git a/app/Admin/Controllers/Article/IndexController.php b/app/Admin/Controllers/Article/IndexController.php index 623280c..462f9c5 100644 --- a/app/Admin/Controllers/Article/IndexController.php +++ b/app/Admin/Controllers/Article/IndexController.php @@ -2,6 +2,7 @@ namespace App\Admin\Controllers\Article; +use App\Admin\Selectable\CategorySelectAble; use App\Models\Article; use App\Models\Category; use Encore\Admin\Controllers\AdminController; @@ -20,7 +21,7 @@ class IndexController extends AdminController $grid->filter(function ($filter) { $filter->column(1 / 2, function ($filter) { $filter->like('title', '文章标题'); - $filter->equal('category.id', '所属分类')->select(Category::selectOptions(function ($model) { + $filter->equal('categories.id', '所属分类')->select(Category::selectOptions(function ($model) { return $model->where('status', 1)->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW]); }, '所有分类')); }); @@ -30,7 +31,9 @@ class IndexController extends AdminController $grid->column('id', '#ID#'); $grid->column('cover', '封面图片')->image('', 100); - $grid->column('category.title', '所属分类'); + $grid->column('所属分类')->display(function () { + return $this->categories()->pluck('title'); + })->label(); $grid->column('title', '文章标题'); $grid->column('sort', '序号'); $states = [ @@ -48,15 +51,7 @@ class IndexController extends AdminController $form = new Form(new Article); $form->text('title', '文章标题')->rules('min:2'); - $form->select('category_id', '所属分类') - ->options(Category::selectOptions(function ($model) { - return $model->where('status', 1)->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW]); - }, '选择分类')) - ->rules('required|min:1', [ - 'required' => '必须选择所属分类', - 'min' => '必须选择所属分类', - ]); - + $form->belongsToMany('categories', CategorySelectAble::class, __('关联分类')); $form->textarea('description', '内容简介')->rules('max:350'); $form->list('subjoin', '附加') diff --git a/app/Admin/Selectable/CategorySelectAble.php b/app/Admin/Selectable/CategorySelectAble.php new file mode 100644 index 0000000..8af4db9 --- /dev/null +++ b/app/Admin/Selectable/CategorySelectAble.php @@ -0,0 +1,44 @@ +categories)->title; + }; + } + + public function make() + { + $this->model()->where('status', 1); + + $this->column('id', 'ID'); + $this->column('title', '分类名称'); + $this->column('type', '类型')->using(Category::TYPES); + + $this->filter(function (Filter $filter) { + $filter->like('title', '分类名称'); + $filter->equal('parent.id', '所属分类') + ->select(Category::selectOptions(function ($model) { + return $model->where('status', 1) + ->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW]); + }, '所有分类')); + $filter->equal('type', '类型')->select(Category::TYPES); + }); + } + +} diff --git a/app/Helpers/function.php b/app/Helpers/function.php index c8f8369..e656e2e 100644 --- a/app/Helpers/function.php +++ b/app/Helpers/function.php @@ -1,126 +1,130 @@ -{$return}; - } - - return $category; - } - - return new Category; -} - -/** - * Notes: 获取文章分类详情 - * @Author: 玄尘 - * @Date : 2020/9/10 13:21 - * @param $categoryId - * @param string $result - * @return \App\Models\Article - */ -function getOneArticleBYCate($categoryId, $result = '') -{ - $info = Article::where('category_id', $categoryId)->latest('sort')->latest()->first(); - - if ($info) { - if ($result) { - return $info->{$result}; - } - - return $info; - } else { - return ''; - } - - return new Article; -} - -/** - * Notes: 获取分类下的文章 - * @Author: 玄尘 - * @Date : 2020/9/10 10:05 - * @param $categoryId - * @param $take - * @return \App\Models\Article - */ -function getArticlesBYCate($categoryId, $take = 8, $mark = 'one') -{ - if ($mark == 'one') { - $articles = Article::where('category_id', $categoryId) - ->where('status', 1) - ->latest('sort') - ->latest() - ->take($take) - ->get(); - } else { - $cate = Category::find($categoryId); - $ids = $cate->getAllChildrenId(); - - $articles = Article::whereIn('category_id', $ids) - ->where('status', 1) - ->latest('sort') - ->latest() - ->take($take) - ->get(); - } - - return $articles; -} - -//获取子分类 -function getCateChild($categoryId) -{ - return Category::where('status', 1) - ->where('parent_id', $categoryId) - ->orderBy('order', 'asc') - ->get(); -} - -//获取顶级分类 -function getTopCate($categoryId) -{ - $parent = Category::find($categoryId); - - while ($parent->parent_id != 0) { - $parent = $parent->parent; - } - - return $parent; -} - -//获取一个广告 -function getOneAdvertByCate($categoryId, $result = '') -{ - $info = Advert::where('category_id', $categoryId) - ->latest('sort') - ->latest() - ->first(); - if ($info) { - if ($result) { - return $info->{$result}; - } - - return $info; - } else { - return ''; - } - - return new Advert; -} - -function getAdvertsByCate($categoryId, $take = 8) -{ - return Advert::where('category_id', $categoryId) - ->latest('sort') - ->latest() - ->take($take)->get(); -} - +{$return}; + } + + return $category; + } + + return new Category; +} + +/** + * Notes: 获取文章分类详情 + * @Author: 玄尘 + * @Date : 2020/9/10 13:21 + * @param $categoryId + * @param string $result + * @return \App\Models\Article + */ +function getOneArticleBYCate($categoryId, $result = '') +{ + $info = Article::where('status', 1) + ->ByCategory($categoryId) + ->latest('sort') + ->latest() + ->first(); + + if ($info) { + if ($result) { + return $info->{$result}; + } + + return $info; + } else { + return ''; + } + + return new Article; +} + +/** + * Notes: 获取分类下的文章 + * @Author: 玄尘 + * @Date : 2020/9/10 10:05 + * @param $categoryId + * @param $take + * @return \App\Models\Article + */ +function getArticlesBYCate($categoryId, $take = 8, $mark = 'one') +{ + if ($mark == 'one') { + $articles = Article::where('status', 1) + ->ByCategory($categoryId) + ->latest('sort') + ->latest() + ->take($take) + ->get(); + } else { + $cate = Category::find($categoryId); + $ids = $cate->getAllChildrenId(); + + $articles = Article::where('status', 1) + ->ByCategory($ids) + ->latest('sort') + ->latest() + ->take($take) + ->get(); + } + + return $articles; +} + +//获取子分类 +function getCateChild($categoryId) +{ + return Category::where('status', 1) + ->where('parent_id', $categoryId) + ->orderBy('order', 'asc') + ->get(); +} + +//获取顶级分类 +function getTopCate($categoryId) +{ + $parent = Category::find($categoryId); + + while ($parent->parent_id != 0) { + $parent = $parent->parent; + } + + return $parent; +} + +//获取一个广告 +function getOneAdvertByCate($categoryId, $result = '') +{ + $info = Advert::where('category_id', $categoryId) + ->latest('sort') + ->latest() + ->first(); + if ($info) { + if ($result) { + return $info->{$result}; + } + + return $info; + } else { + return ''; + } + + return new Advert; +} + +function getAdvertsByCate($categoryId, $take = 8) +{ + return Advert::where('category_id', $categoryId) + ->latest('sort') + ->latest() + ->take($take)->get(); +} + diff --git a/app/Http/Controllers/ArticleController.php b/app/Http/Controllers/ArticleController.php index f238a04..4cd37d9 100644 --- a/app/Http/Controllers/ArticleController.php +++ b/app/Http/Controllers/ArticleController.php @@ -13,10 +13,8 @@ class ArticleController extends Controller if ($article->url) { return redirect($article->url); } - $category = $article->category; - $parent = $category->getTop(); - return view('articles.show', compact('article', 'category', 'parent')); + return view('articles.show', compact('article')); } } diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 062908a..472acd0 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -11,7 +11,7 @@ class CategoryController extends Controller /** * 显示分类 * @param Category $category [description] - * @return [type] [description] + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View [type] [description] */ public function index(Category $category) { diff --git a/app/Http/Controllers/TestController.php b/app/Http/Controllers/TestController.php index 748c403..94fe9c5 100644 --- a/app/Http/Controllers/TestController.php +++ b/app/Http/Controllers/TestController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\Article; +use App\Models\ArticleCategory; use App\Models\Category; use App\Models\DedeArchive; use App\Models\DedeArctype; @@ -10,6 +11,7 @@ use App\Traits\Tree; class TestController extends Controller { + use Tree; public function index() @@ -17,6 +19,22 @@ class TestController extends Controller } + public function set_article_category() + { + $articles = Article::whereHas('category') + ->chunk(200, function ($articles) { + foreach ($articles as $article) { + ArticleCategory::create([ + 'article_id' => $article->id, + 'category_id' => $article->category_id, + ]); + } + }); + + return true; + + } + public function setCateArticle() { $article = []; @@ -58,7 +76,7 @@ class TestController extends Controller dump(count($oldids)); dump($diffids); die(); - $map = [ + $map = [ 'id' => ['in', $diffids], ]; $list = DedeArchive::whereIn('id', $diffids)->get(); @@ -88,7 +106,7 @@ class TestController extends Controller dd('已经导入过数据'); } $categorys = Category::get(); - $error = $success = []; + $error = $success = []; DedeArchive::whereNotNull('litpic')->chunk(200, function ($articles) use ($categorys) { foreach ($articles as $article) { @@ -128,7 +146,9 @@ class TestController extends Controller if ($categorys->count()) { dd('已经导入过数据'); } - $lists = DedeArctype::where('ishidden', 0)->select('id', 'reid as parent_id', 'typename as title', 'content')->get(); + $lists = DedeArctype::where('ishidden', 0) + ->select('id', 'reid as parent_id', 'typename as title', 'content') + ->get(); $list = Tree::list2tree($lists->toArray(), 'id', 'parent_id', 'children', 0); foreach ($list as $key => $value) { @@ -151,6 +171,7 @@ class TestController extends Controller 'content' => $category['content'], 'status' => 1, ]; + return $data; } diff --git a/app/Models/Article.php b/app/Models/Article.php index eab2ec3..ab7a3be 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -4,11 +4,12 @@ namespace App\Models; use App\Models\Traits\BelongsToCategory; use App\Models\Traits\HasOneCover; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Article extends Model { - use HasOneCover, BelongsToCategory; + use HasOneCover; /** * 应进行类型转换的属性 @@ -23,4 +24,35 @@ class Article extends Model return route('article.show', $this); } + /** + * Notes: 关联分类 + * @Author: 玄尘 + * @Date : 2021/4/2 9:11 + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function categories(): BelongsToMany + { + return $this->belongsToMany(Category::class) + ->using(ArticleCategory::class); + } + + /** + * Notes: description + * @Author: 玄尘 + * @Date : 2021/4/2 9:17 + * @param $query + * @param $ids + * @return mixed + */ + public function scopeByCategory($query, $ids) + { + if (!is_array($ids)) { + $ids = [$ids]; + } + + return $query->whereHas('categories', function ($q) use ($ids) { + $q->whereIN('id', $ids); + }); + } + } diff --git a/app/Models/ArticleCategory.php b/app/Models/ArticleCategory.php new file mode 100644 index 0000000..897b0d0 --- /dev/null +++ b/app/Models/ArticleCategory.php @@ -0,0 +1,11 @@ +belongsTo(Article::class); break; case self::TYPE_ARTICLE: - return $this->hasMany(Article::class); + return $this->belongsToMany(Article::class); break; case self::TYPE_ADVERT: return $this->hasMany(Advert::class); @@ -60,6 +61,11 @@ class Category extends Model { return $this->belongsTo(Article::class); } + + public function articles(): BelongsToMany + { + return $this->belongsToMany(Article::class); + } /** * Notes: 获取当前分类及子分类ID diff --git a/database/migrations/2021_04_01_151442_create_article_categories_table.php b/database/migrations/2021_04_01_151442_create_article_categories_table.php new file mode 100644 index 0000000..002906d --- /dev/null +++ b/database/migrations/2021_04_01_151442_create_article_categories_table.php @@ -0,0 +1,32 @@ +foreignId('article_id'); + $table->foreignId('category_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::dropIfExists('article_categories'); + } + +} diff --git a/resources/views/articles/show.blade.php b/resources/views/articles/show.blade.php index 859b9eb..c1a3f78 100644 --- a/resources/views/articles/show.blade.php +++ b/resources/views/articles/show.blade.php @@ -7,43 +7,43 @@