目录
一、迁移文件
编写迁移文件的目的是为了将产生数据表的操作通过文件形式记录下来,这样在项目发生迁移的时候可以方便的产生和原来一样的数据表。做到 “一次编写,到处使用”。
目录位置:database/migrations
1、创建迁移文件
php artisan make:migration create_article_table
php artisan make:migration create_user_table
执行迁移命令,生成以下两个文件:
yyyy_mm_dd_xxxxxx_create_article_table.php
yyyy_mm_dd_xxxxxx_create_user_table.php
2、编写迁移文件
(1)yyyy_mm_dd_xxxxxx_create_article_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateArticleTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('article', function (Blueprint $table) {
$table->increments('id'); //article_id, primary_key
$table->string('article_name', 100)->notNull(); //article_name
$table->tinyInteger('author_id')->notNull(); //author_id
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('article');
}
}
(2) yyyy_mm_dd_xxxxxx_create_user_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAuthorTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('author', function (Blueprint $table) {
$table->increments('id'); //author_i, primary_key
$table->string('author_name', 20)->notNull(); //author_name
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('author');
}
}
3、创建迁移记录表
如果是第一次执行迁移文件,则需要先创建记录表,执行以下命令,会自动在数据库中创建 migration 表。
php artisan migrate:install
migration 表包含了 id、migration、batch 三个字段,分别代表 主键、创建的表、创建批次。该表会在迁移文件的执行过程中自动维护,不需要用户干预。下表为执行迁移文件创建数据表后的 migration 表。
4、执行迁移文件-创建数据表
php artisan migrate
5、执行迁移文件-删除数据表
php artisan migrate:rollback
二、填充文件
编写填充文件的目的:一是为了向数据表中填充数据,以便用于测试或者从其他数据库导入初始数据;二是将填充数据的操作记录下来,随项目迁移,以便一次记录,多次使用。
目录位置:database/seeds
1、创建填充文件
php artisan make:seeder ArticleAndAuthorTableSeeder
2、编写填充文件
ArticleAndAuthorTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class ArticleAndAuthorTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// article 表
DB::table('article')->insert([
[
'article_name' => '西游记',
'author_id' => rand(1,3)
],
[
'article_name' => '射雕英雄传',
'author_id' => rand(1,3)
],
[
'article_name' => '神雕侠侣',
'author_id' => rand(1,3)
]
]);
// author 表
DB::table('author')->insert([
[
'author_name' => '古龙'
],
[
'author_name' => '金庸'
],
[
'author_name' => '吴承恩'
]
]);
}
}
3、执行填充文件
执行后会向数据表中填充数据,以便用于测试或者填入原始数据。
php artisan db:seed --class=ArticleAndAuthorTableSeeder
三、模型文件
使用 迁移文件 和 填充文件,完成了数据表的创建和初始数据的填入,主要是为了便于随项目迁移,实则是可有可无。也可以编写通过 sql 命令或脚本的形式,通过 sql 客户端创建表和填充数据。
除了使用 DB 门面与数据库交互,还可以通过模型与数据库交互。使用模型需要首先定义一个模型类,并绑定到对应的数据表。使用模型的好处:
(1)在模型类中可以对数据表进行一些设置,对访问进行一些限制;
(2)可以通过编写关联方法,进行模型之间的关联,以便于替代 join、leftjoin,以简单的语句实现复杂的联表查询。
目录位置:模型文件默认目录为 app,为了清晰目录,一般在 app 下自定义一个 Models 目录作为模型位置,因此习惯将目录设置为 app/Models。
1、创建模型文件
php artisan make:model Models/Article # 创建模型文件
php artisan make:model Models/Author # 创建模型文件
2、编写模型文件
(1)app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
/*
id 文章id
article_name 文章name
author_id 作者id(关联键)
*/
protected $table = 'article'; # 绑定数据表
public $timestamps = false; # 不创建时间戳
//protected $fillable = ['article_name', 'author_id']; # 可写白名单,限制可写字段
}
(2)app/Models/Author.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Author extends Model
{
/*
id 作者id(关联键)
author_name 作者name
*/
protected $table = 'author'; # 数据表绑定
public $timestamps = false; # 不适用时间戳字段
//protected $fillable = ['author_name']; # 可写白名单
}
五、查询数据表
定义路由和编写控制器方法,在控制器中声明模型后,可以通过两种模型调用方式与数据表交互:静态调用模型(静态方法)、动态调用模型(通过实例化对象),此外还可以通过直接使用 DB门面 与数据库交互。
模型的静态调用、动态调用效果是一样的。但是 模型方法 和 DB门面 的调用有区别。
<?php
namespace App\Http\Controllers\Home;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use App\Models\Article;
use App\Models\Author;
class SelectController extends Controller
{
//获取数据的区别:模型(伪二维数组/伪数组对象) 和 DB门面(伪对象数组)
//总结:
// DB比较原始,所以是伪对象数组;
// 模型比较先进,所以是伪对象数组,也是伪二维数组。
public function test1(){
//模型
$data = Article::get(); // 同 $data = (new Article())->get();
dump($data); //集合->数组[5]->对象(包含表结构属性)->数组(包含数据属性)。 伪二维数组 / 伪数组对象
dump($data->toArray()); //数组[5]->数组(包含数据属性)。 真二维数组
dump($data->toArray()[0]); //数组
dump($data->toArray()[0]['id']); //属性
//模型:伪二维数组
//在不转化为数组的情况下,可以在 laravel 中直接当二维数组用
//只不过是 laravel 帮我们做了处理,如果传递到前端,还是要转化数组
dump($data[0]); //数组(记录),既可以看作对象,又可以看作数组
dump($data[0]['id']); //元素(属性),获取数组的元素
dump($data[0]->id); //成员(属性),获取对象的成员
echo '----------------------------------------------------------------------<br>';
// +号是可见属性,可获取;
// #号是不可见属性,不可获取。
//DB门面
$data = DB::table('article')->get();
dump($data); //集合->数组[5]->对象(包含数据属性)。 伪对象数组
dump($data->toArray()); //数组[5]->对象(只包含数据属性)。 真对象数组
dump($data->toArray()[0]); //对象
dump($data->toArray()[0]->id); //属性
//DB门面:伪对象数组
dump($data[0]); //对象(记录)
dump($data[0]->id); //属性(属性)
}
}
六、命令汇总
1、迁移文件
php artisan make:migration create_article_table # 创建迁移文件yyyy_mm_dd_xxxxxx_create_article_table.php
php artisan make:migration create_author_table # 创建迁移文件yyyy_mm_dd_xxxxxx_create_author_table.php
php artisan migrate:install # 创建迁移记录表 migration(第一次用)
php artisan migrate # 创建数据表 article、author
php artisan migrate:rollback # 删除数据表
2、填充文件
php artisan make:seeder ArticleAndAuthorTableSeeder # 创建填充器文件 ArticleAndAuthorTableSeeder.php
php artisan db:seed ArticleAndAuthorTableSeeder # 执行填充器文件,填充数据,可以多个表一起填充
3、模型文件
php artisan make:model Models/Article # 创建模型文件 Article.php
php artisan make:model Models/Author # 创建模型文件 Author.php