Laravel入门教程——一个简单cms的实现(02)

作者: douyasi
网站:https://douyasi.com/category/startlaravel/
备注:本教程是在当前最新Laravel稳定版v4.2.X下实现的,其它相异版本如果有问题请自行排除。
本文为作者原创记录,转载请保留署名与来源。

建立数据库

Laravel 框架自带数据库建立与迁移工具,使用 php artisan 可以很方便建立或迁移数据库。

下面简单说下本cms数据库结构。

数据库表结构

实现本cms需要用到多张表,为了加快教程,我们先把最主要的2张表(某些扩展或关联字段也有可能被省去)——管理用户表 admin 和文章表article 拿出来操作。

其它表,诸如文章分类表,文章标签表,系统设置配置表等一律略去。

admin表:

字段名类型备注说明
idint管理用户ID(自增)
usernamevarchar管理用户名,用于登录
passwordvarchar管理用户密码

article表:

字段名类型备注说明
idint文章ID(自增)
titlevarchar文章标题
contenttext文章内容
slugvarchar文章缩略名

使用Artisan和Migrations建立数据库

命令行终端里输入以下命令:

php artisan migrate:install

执行之后,会发现目标数据库里多出了 {prefix}_migrations 的表, {prefix} 对应你数据库设置的表前缀。

接着我们执行下面语句:

php artisan migrate:make create_admin_table
php artisan migrate:make create_article_table

执行之后,我们发现在 /app/database/migrations下多出带日期时间前缀的create_admin_table.phpcreate_article_table.php 文件。

先打开create_admin_table.php文件,添加以下代码:

    public function up()
    {
        Schema::create('admin', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('username',20)->index();
            $table->string('password',60);
            $table->softDeletes();  //软删除
            /*使用softDeletes,表中会多出timestamp类型
            的'deleted_at'字段*/
            $table->timestamps();  //时间戳
            /*使用timestamps,表中会多出timestamp类型
            的'created_at'和'updated_at'字段*/
        });
    }
    public function down()
    {
        Schema::drop('admin');
    }

再打开create_article_table.php文件,添加以下代码:

    public function up()
    {
        Schema::create('article', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title',120)->index();
            $table->text('content');
            $table->string('slug',60)->nullable();
            $table->softDeletes();
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('article');
    }

保存完毕之后我们继续运行命令:

php artisan migrate

会提示你是否执行此命令,输入y回车,之后如果看到下文就说明数据库建立成功了。

**************************************
*     Application In Production!     *
**************************************
Do you really wish to run this command? y
Migrated: 2014_10_11_060945_create_admin_table
Migrated: 2014_10_11_061004_create_article_table  

使用seed数据库填充

Laravel 可以简单的使用 seed 类填充测试数据到数据库。所有的 seed 类放在 app/database/seeds 目录下。可以使用任何您想要的类名称,但是应该遵守某些大小写规范,如 UserTableSeeder 之类。默认已经有一个 DatabaseSeeder 类。

当然你也可以使用Laravel第三方包或插件(比如 way/generatorsfzaninotto/faker )来管理和填充填充数据。我也推荐大家使用 generatorsfaker 来进行数据库填充,这里连载文章定位于 Laravel 入门教程,以贴近官方帮助手册为准,故不再赘述,可具体参考下这篇博文教程

我们手动在seed目录下建立2个seeder文件,位于 /app/database/seeds/AdminTableSeeder.php 文件代码:

<?php
class AdminTableSeeder extends Seeder {
    public function run()
    {
        DB::table('admin')->delete();
        Admin::create(
        array(
            'username' => 'admin',
            'password' => Hash::make('123456'),
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
            //'created_at' => Carbon::now()->toDateTimeString(), 
            //'updated_at' => Carbon::now()->toDateTimeString(),
            /*使用Carbon需在app/config/app.php下注册ClassAliases*/
        ));
    }
}

注:使用时间处理的Carbon扩展包需要在/app/config/app.php配置Class Aliases,不然无法识别。

'aliases' => array(
    'App'     => 'Illuminate\Support\Facades\App',
    'Artisan' => 'Illuminate\Support\Facades\Artisan',
    'Auth'    => 'Illuminate\Support\Facades\Auth',
    'Blade'   => 'Illuminate\Support\Facades\Blade',
    ......,
    'Carbon'  => 'Carbon\Carbon',
    ......,
    )

位于 /app/database/seeds/AdminTableSeeder.php 文件代码:

class ArticleTableSeeder extends Seeder {

    public function run()
    {
        DB::table('article')->delete();
        Article::create(
        array(
            'title' => 'Test',
            'content' => 'Test Content',
            'slug' => 'test',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
        ));
    }
}

位于 /app/database/seeds/AdminTableSeeder.php 文件代码:

<?php
class DatabaseSeeder extends Seeder {
    public function run()
    {
        Eloquent::unguard();
        // $this->call('UserTableSeeder');
        $this->call('AdminTableSeeder');
        $this->command->info('Admin table seeded!');
        $this->call('ArticleTableSeeder');
        $this->command->info('Article table seeded!');
    }
}

好,下面我们在命令行终端运行以下命令:

php artisan db:seed

结果我们发现命令行终端报错,很好,很多时候,照本宣科地按着我们教程来,也会出现一些意外,错误提示一大串,最主要原因是: Class 'Admin' not found。我们需要解决这个问题,那原因是啥呢?Laravel 使用 Eloquent ORM,而我们没有创建对应的 AdminArticle 这2个 Eloquent 模型。
下面我们在 /app/models/ 目录下,参考 Laravel 本身的 User.php,来定义 AdminArticleEloquent 模型。

/app/models/Admin.php代码如下:

<?php
class Admin extends Eloquent {
    protected $table = 'admin';
}

/app/models/Article.php代码如下:

<?php
class Article extends Eloquent {
    protected $table = 'article';
}

模型里面先写这么多,留待后续扩展。

好,我们再次执行php artisan db:seed命令,发现成功了,出现以下提示即表明成功!

**************************************
*     Application In Production!     *
**************************************
Do you really wish to run this command? y
Seeded: AdminTableSeeder
Admin table seeded!
Seeded: ArticleTableSeeder
Article table seeded!

打开数据库对应数据表,我们发现测试数据已经添加上来了。

到此,我们已经建立好数据库,并在每张表中加入了一条测试数据,下一节,我们开始进行前台页面展示,其中会涉及到路由,控制器等操作。

标签:laravel