前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel5.6博客中文章标签增删改查

Laravel5.6博客中文章标签增删改查

作者头像
写PHP的老王
发布2019-08-12 15:23:40
6010
发布2019-08-12 15:23:40
举报
文章被收录于专栏:写PHP的老王写PHP的老王
文章标签后台管理

1、创建标签模型和迁移 首先需要创建 Tag 模型类:

php artisan make:model --migration Tag

该命令会在 app 目录下创建模型文件 Tag.php,由于我们在 make:model 命令中使用了 --migration 选项,所以同时会创建 Tag 模型对应的数据表迁移。

在标签(Tag)和文章(Post)之间存在多对多的关联关系,因此还要按照下面的命令创建存放文章和标签对应关系的数据表迁移:

php artisan make:migration --create=post_tag_pivot create_post_tag_pivot 编辑标签迁移文件

在 database/migrations 目录下编辑新创建的标签迁移文件内容如下:

代码语言:javascript
复制
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('tag')->unique();
            $table->string('title');
            $table->string('subtitle');
            $table->string('page_image');
            $table->string('meta_description');
            $table->string('layout')->default('blog.layouts.index');
            $table->boolean('reverse_direction');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tags');
    }
}

下面我们对上面迁移文件中新增的字段作简要说明:

page_image:标签图片 meta_description:标签介绍 layout:博客终归要使用布局 reverse_directions:在文章列表按时间升序排列博客文章(默认是降序)

编辑文章与标签对应关系迁移 编辑文章与标签对应关系表迁移文件内容如下:

代码语言:javascript
复制
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostTagPivot extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('post_tag_pivot', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('post_id')->unsigned()->index();
            $table->integer('tag_id')->unsigned()->index();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('post_tag_pivot');
    }
}

运行迁移 登录到 Homestead 虚拟机在项目根目录下通过运行如下 Artisan 命令以生成这两个数据表:

php artisan migrate

创建控制器添加路由

运行 php artisan make:controller Admin\TagController 创建控制器文件

在routes/web.php文件中,将管理员路由改成以下内容:

代码语言:javascript
复制
Route::namespace('Admin')->middleware(['auth'])->group(function () {
    Route::resource('admin/default', 'DefaultController');
    Route::resource('admin/post', 'PostController');
    Route::resource('admin/tag', 'TagController');
});
  • 实现标签列表 在TagController 中添加index方法,具体引入的类可以参照之前的Post。
代码语言:javascript
复制
    public function index()
    {
        $tags = Tag::orderBy('created_at', 'desc')
                ->paginate(config('blog.posts_per_page'));
        return view('admin.tag.index')->withTags($tags);
    }

在resources/views/admin/tag下创建index.blade.php视图文件(内容见文后地址)

控制器,模板创建成功。访问http://127.0.0.1:8000/admin/tag可以看到界面显示出来了,但是没有数据。因此需要填充一些数据。

根据之前的教程,填充数据的步骤: php artisan make:seeder TagsTableSeeder创建生seeder,命令会在database\seeds目录下创建TagsTableSeeder.php文件,文件内容如下:

代码语言:javascript
复制
<?php

use Illuminate\Database\Seeder;

class TagsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run(){
        factory(App\Tag::class, 50)->create();
    }
}

在database\factories下创建TagFactory.php文件,文件内容如下:

代码语言:javascript
复制
<?php
use Faker\Generator as Faker;
$factory->define(App\Tag::class, function (Faker $faker) {
    $t = $faker->dateTimeBetween('-1 month', '+3 days');
    return [
        'tag' => $faker->sentence(mt_rand(1, 3)),
        'title' => $faker->sentence(mt_rand(3, 10)),
        'subtitle' => $faker->sentence(mt_rand(3, 10)),
        'page_image'=>'',
        'meta_description'=>'',
        'layout'=>'',
        'reverse_direction'=>1,
        'created_at' => $t,
        'created_at' => $t,
    ];
});

执行 composer dump-autoload,保证新增的两个文件能够正常引入。执行命令php artisan db:seed --class=TagsTableSeeder 生成tag的假数据。

执行过程有可能会报错,因为tag的唯一性冲突,可以直接跳过,我们只是生成假数据方便展示而已。

重新访问http://127.0.0.1:8000/admin/tag可以看到列表中已经填充了很多数据。

创建标签

执行命令php artisan make:job TagFormFields 创建一个表单数据字段创建Job,生成文件在app\Jobs\TagFormFields.php目录下。(内容见文后地址)

执行命令php artisan make:request TagCreateRequest,在app\Http\Requests目录下创建TagCreateRequest.php (内容见文后地址)

对数据表单进行验证,格式化成数据库需要的数据。

在TagController中添加create,store方法。内容如下,注意添加TagCreateRequest,TagFormFields的引用

代码语言:javascript
复制
    /**
     * Show the new tag form
     */
    public function create(){
        $data = $this->dispatch(new TagFormFields());
        return view('admin.tag.create', $data);
    }

    /**
     * Store a newly created tag
     *
     * @param PostCreateRequest $request
     */
    public function store(TagCreateRequest $request)
    {
        $tag = Tag::create($request->tagFillData());
        return redirect()->route('tag.index')
                        ->withSuccess('New Tag Successfully Created.');
    }

在resources\views\admin\tag下添加create.blade.php视图文件(内容见文后地址) create视图文件引入了表单视图。在相同文件夹下创建_form.blade.php视图文件(内容见文后地址)

到这里标签创建的部分就结束了,访问http://127.0.0.1:8000/admin/tag/create可以看到以下内容

完善页面信息,点击保存,可以看到标签创建成功,并重定向到了标签列表页面。

标签编辑

执行命令php artisan make:request TagUpdateRequest,在app\Http\Requests目录下创建TagUpdateRequest.php,修改内容如下:

代码语言:javascript
复制
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TagUpdateRequest extends TagCreateRequest
{

}

控制器添加edit,update方法

代码语言:javascript
复制
    public function edit($id)
    {
        $data = $this->dispatch(new TagFormFields($id));
        return view('admin.tag.edit', $data);
    }
    /**
     * Update the Post
     *
     * @param PostUpdateRequest $request
     * @param int $id
     */
    public function update(TagUpdateRequest $request, $id)
    {
        $tag = Tag::findOrFail($id);
        $tag->fill($request->tagFillData());
        $post->save();
        if ($request->action === 'continue') {
            return redirect()->back()->withSuccess('Tag saved.');
        }
        return redirect()->route('tag.index')->withSuccess('Tag saved.');
    }

在resources\views\admin\tag下添加edit.blade.php(内容见文后地址)

删除标签

在TagController下添加以下内容:

代码语言:javascript
复制
    public function destroy($id)
    {
        $post = Tag::findOrFail($id);
        $post->delete();

        return redirect()->route('tag.index')->withSuccess('Tag deleted.');
    }

在index.blade.php中的edit后面添加以下内容:

代码语言:javascript
复制
<form style="display:inline" action="/admin/tag/{{ $tag->id }}" method="post">
    @csrf
    @method('DELETE')
    <button type="submit" class="btn btn-danger">
        {{ __('Delete') }}
    </button>
</form>

因为使用的是resouce路由,laravel的resouce路由只接受delete提交或者模拟delete提交,因此需要一个表单,添加@method('DELETE')的方式模拟delete请求。

以上就是Laravel5.6 博客 中文章标题的增删改查操作!

文章的代码下载地址

http://blog.static.aiaiaini.com/laravel5.6-blog-tag-curd.zip

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章标签后台管理
  • 创建控制器添加路由
  • 创建标签
  • 标签编辑
  • 删除标签
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档