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 目录下编辑新创建的标签迁移文件内容如下:
<?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:在文章列表按时间升序排列博客文章(默认是降序)
编辑文章与标签对应关系迁移 编辑文章与标签对应关系表迁移文件内容如下:
<?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文件中,将管理员路由改成以下内容:
Route::namespace('Admin')->middleware(['auth'])->group(function () {
Route::resource('admin/default', 'DefaultController');
Route::resource('admin/post', 'PostController');
Route::resource('admin/tag', 'TagController');
});
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文件,文件内容如下:
<?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文件,文件内容如下:
<?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的引用
/**
* 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,修改内容如下:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TagUpdateRequest extends TagCreateRequest
{
}
控制器添加edit,update方法
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下添加以下内容:
public function destroy($id)
{
$post = Tag::findOrFail($id);
$post->delete();
return redirect()->route('tag.index')->withSuccess('Tag deleted.');
}
在index.blade.php中的edit后面添加以下内容:
<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