laravel 文章与分类(多对多)

文章/分类–多对多

写在前面的话:在处理这个问题的时候心态已经爆炸了…在真正解决之后我们就来总结一下吧,毕竟以后要用到的…
项目环境:Laravel5.6+homestead+MySql
(下次用laravel6.0试一下,我们要跟上时代的步伐!!!!)
坚决介绍一下主要的功能吧。
文章管理:主要是牵扯到的文章的一系列属性和文章属于那几个分类,而且后面也会想到这个分类下有哪些文章;网上也有许多教程,Laravel的文档中也有提到…大家可以下先了解一下哦。

文章属性:标题(title)、内容(content)、发布时间(date)、状态(status)。(这里我已经将文章的属性简化了,其他的没有必要在这里废话。)
分类属性:分类名称(name)、分类别名(nick)、状态(status)。
(这里加上状态这个字段,方便以后的软删除)。

我们使用命令行建立两个表:文章表(articles)、分类表(sort)。
然后根据上面提到的属性添加字段:

            $table->increments('id');
            $table->string('title')->nullable()->comment('文章标题');
            $table->text('content')->nullable()->comment('文章内容');
            $table->string('img')->nullable()->comment('文章图片');
            $table->string('auth')->nullable()->comment('文章发布者');
            $table->string('date')->nullable()->comment('文章发布日期');
            $table->string('mark')->nullable()->comment('文章摘要');
            $table->string('keyword')->nullable()->comment('文章关键词');
            $table->string('hot')->nullable()->comment('文章属性(推荐)');
            $table->string('status')->nullable()->comment('文章状态');
            $table->timestamps();
 			$table->increments('id');
            $table->string('name')->nullable()->comment('分类名称');
            $table->string('nick')->nullable()->comment('分类别名');
            $table->string('img')->nullable()->comment('图片');
            $table->string('status')->nullable()->comment('状态');
            $table->string('mark')->nullable()->comment('摘要');
            $table->timestamps();

请根据实际情况选择

既然多对多,我们就要将两个表关联起来。
中间表(article_sort):文章ID(article_id)、分类ID(sort_id)、状态(status)。

            $table->increments('id');
            $table->string('article_id')->nullable()->comment('文章ID');
            $table->string('sort_id')->nullable()->comment('分类ID');
            $table->string('status')->default(1)->comment('状态');
            $table->timestamps();

建立这三个表的模型:
Article.php:



namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    //
    protected $table = "articles";
    protected $fillable = [
        'title',
        'content',
        'img',
        'date',
        'mark',
        'keyword',
        'status'
    ];
    public function sort()
    {
        # code...
        return $this->belongsToMany('App\Models\Sort', 'article_sort', 'article_id', 'sort_id')->wherePivot('status', 1);
    }
     public function clearSort()
    {
        # code...
        Article_Sort::clearSort($this->id);
    }
}

Sort.php:



namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Sort extends Model
{
    //
    protected $table = "sort";
    protected $fillable = [
        'name',
        'nick',
        'img',
        'status',
        'mark',
    ];
    public function articles()
    {
        # code...
        return $this->hasMany('App\Models\Article');
    }
}

Article_Sort.php:



namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article_Sort extends Model
{
    //
    protected $table = 'article_sort';
    protected $fillable = [
        'article_id',
        'sort_id',
        'status'
    ];

    public static function editThis($article_id, $sort_id)
    {
        return self::updateOrCreate(["article_id" => $article_id, "sort_id" => $sort_id], ['status' => 1]);
    }

    public function chage($status)
    {
        # code...
        $this->status = $status;
        $this->save();
    }

    public static function clearSort($id)
    {
        # code...
        self::where('article_id', $id)->update(['status' => 0]);
    }
}

文章表单(_form.blade.php)

<div class="card-body">
    <form method="post" action="" enctype="multipart/form-data">
        {{-- {{ csrf_field() }} --}}
        @csrf
        <div class="form-group">
            <label for="">请选择类型label>
            <div>
                @foreach ($sorts as $value)
                <input type="checkbox" name="type[]" value="{{$value->id}}" id="t{{$value->id}}"
                    {{$article->sort->contains('id',$value->id)?" checked":" "}}>
                <label for="t{{$value->id}}" style="font-weight:normal">{{$value->name}}label>
                @endforeach
            div>

        div>
        <div class="form-group">
            <label for="">标题label>
            
        div>
        <div class="form-group">
            <label for="">内容label>
            
   
        div>   
        <div class="form-footer">
            <div class="form-group col-md-6">
                <div class="col-md-9 col-md-offset-3">
                    <button type="submit" class="btn btn-primary">保存button>
                div>
            div>
        div>
    form>
div>

关于内容部分,建议使用某种编辑器:markdown、WangEditor…
这里是部分代码,只有简略的模型、谨慎使用(修改和新增共用一个表单)。
我相信你们自己做出来的页面更加完美。

分类表单(_form.blade.php):


<div class="card-body">
    <form method="post" action="" enctype="multipart/form-data">
        {{ csrf_field() }}
        @if (count($errors)>0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}li>
                @endforeach
            ul>
        div>
        @endif
        <div class="form-group">
            <label for="">分类名称label>
            
        div>
        <div class="form-group">
            <label for="">别名label>
            
        div>
        <div class="form-group col-md-6">
            <div class="col-md-9 col-md-offset-3">
                <button type="submit" class="btn btn-primary">保存button>
            div>
        div>
div>
form>
div>

路由部分就不说了,很简单的。。。
控制器部分(新增分类部分):
SortController.php:

public function create(Request $request)
    {
        $sort = new Sort();
        if ($request->isMethod('post')) {
            $validator = Validator::make(
                $request->all(),
                [
                    'name' => 'required|min:1|max:255',
                    'nick' => 'required|sometimes|unique:sort',
                    // 'content' => 'required|min:1|max:255',
                ],
                [
                    'required' => ':attribute 为必填项',
                    'nick.unique' => ':attribute 已存在',
                    'min' => ':attribute 长度不符合要求',
                    'max' => ':attribute 长度不符合要求',
                ],
                [
                    'name' => '标题',
                    'nick' => '别名',
                    'content' => '内容',
                ]
            );
            if ($validator->fails()) {
                return redirect()->back()->withErrors($validator)->withInput();
            }
            $data = $request->all();
            $sort->name = $data['name'];
            $sort->nick = $data['nick'];
            $sort->status = 1;
            if ($sort->save()) {
                $currentPage = Session::get("picPage");
                return redirect("sort/index?page={$currentPage}");
            }
        }
        return view('admin.sort.add', compact('sort'));
    }
    头部已入(重点:use Illuminate\Support\Facades\Session;
				use Illuminate\Support\Facades\Storage;
				use Illuminate\Support\Facades\Validator;

文章新建、修改
ArticleController.php:

public function create(Request $request)
    {
        $sorts = Sort::where('status', 1)->get();
        $article = new Article();
        if ($request->isMethod('post')) {
            $data = $request->all();
            $article = Article::create($data);
            $article->status = 1;
            //对多对关联
            $article->sort()->attach($request->type);
            $article->sort()->status = 1;
        
            $article->date = Carbon::now();
            if ($article->save()) {
                $currentPage = Session::get("picPage");
                return redirect("article/index?page={$currentPage}");
            }
        }
        return view('admin.article.add', compact('sorts', 'article'));
    }
public function update(Request $request, $id)
    {
        $article = Article::find($id);
        $sorts = Sort::where('status', 1)->get();
        if ($request->isMethod('post')) {
            $data = $request->all();
            $article->title = $data['title'];
            $article->content = $data['content'];
            //多对多关系 模型方法处理(见上方模型方法)
            $article->clearSort();
            foreach ($request->type as $key => $value) {
                Article_Sort::editThis($article->id, $value);
            }
            $article->save();
 
            if ($article->save()) {
                $currentPage = Session::get("picPage");
                return redirect("article/index?page={$currentPage}");
            }
        }
        return view('admin.article.update', compact('article', 'sorts'));
    }

你可能感兴趣的:(Laravel)