文章目录
前言
数据库的创建与配置
使用DB类操作数据库
使用DB类进行增删改查
执行SQL
连接查询
使用模型操作数据库
初识模型
定义模型
在控制器中使用模型
使用模型增删改查
关联模型的使用
一对一
一对多
多对一
多对多
数据表的迁移和填充
数据表的迁移
数据表的填充
总结
前言
这是作者本人在校内学习了laravel框架项目的开发,取出了其中比较重要的数据库操作的学习心得,希望这些知识点能让各位读者在使用laravel框架的过程中能够熟练运用并操作数据库。数据库是程序设计的重要部分,不同数据库的连接方法和查询语句都不同,如果项目后期有更换数据库的需求,就需要在项目中修改所有的查询语句和连接方法,这是一个相当大的工作量。Laravel框架采用统一的接口实现对不同数据库操作的封装,使得对数据库的连接和操作变得非常容易。
数据库的创建与配置
数据库的配置文件是config\database.php,数据库配置相关示例代码。
'mysql' => [
'driver' => 'mysql', // 数据库驱动
'host' => env('DB_HOST', '127.0.0.1'), // 主机名或IP
'port' => env('DB_PORT', '3306'), // 端口
'database' => env('DB_DATABASE', 'forge'), // 数据库名
'username' => env('DB_USERNAME', 'forge'), // 用户名
'password' => env('DB_PASSWORD', ''), // 密码
'unix_socket' => env('DB_SOCKET', ''), // socket路径
'charset' => 'utf8mb4', // 字符集
'collation' => 'utf8mb4_unicode_ci', // 校对集
'prefix' => '', // 数据库表前缀
'strict' => true, // 使用严格模式
'engine' => null, // 指定存储引擎
],
.env文件中的数据库配置信息。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=123456
使用DB类操作数据库

使用DB类前必须在控制器引用DB类
<?php
namespace App\Http\Controllers;
use DB; // 引入DB类
……(原有代码)
使用DB类进行增删改查
//添加数据的 insert() insertGetId()
//insert()方法:返回值为true或false,表示是否添加成功
//insertGetId()方法:返回值为自动增长的id
DB::table('数据表名')->insert(数据)
DB::table('数据表名')->insertGetId(数据)
//修改数据的 update() increment() decrement()
//update()方法用来修改指定的字段
//increment()方法用来对数字进行递增
//decrement()方法用来对数字进行递减
DB::table('数据表名')->update(数据)
DB::table('数据表名')->increment('数据')
DB::table('数据表名')->decrement('数据')
//查询数据 get() first() select()方法 value()方法
//get()方法,查询多行数据
//first(),查询单行数据
//select(),方法查询指定字段的值
//value()方法,查询某个字段的值
//使用orderBy()方法进行排序,第1个参数指定排序字段,第2个参数指定排序规则,包括asc(升序)或desc//(降序)。
//使用limit()方法和offset()方法实现分页,limit()方法指定每页显示的记录数,offset()方法设置开始的偏移量。
DB::table('数据表名')->get();
DB::table('数据表名')->first();
DB::table('数据表名')->select('字段', '字段')->get();
DB::table('数据表名')->where('字段', '1')->value('name');
$data = DB::table('数据表名')->orderBy('字段', 'desc')->get();
$data = DB::table('数据表名')->limit(3)->offset(2)->get();
//删除数据 delete()方法 truncate()
//使用delete()方法删除指定的记录
//使用truncate()方法清空整个数据表
DB::table('数据表名')->where('字段', '1')->delete();
DB::table('数据表名')->truncate();
执行SQL
通过DB类直接执行SQL语句:
// 执行SELECT语句,返回结果集
$data = DB::select('SELECT * FROM `member`');
dump($data);
// 执行INSERT语句,返回true或false
DB::insert('INSERT INTO `member` SET `name`=\'tom\'');
// 执行UPDATE语句,返回受影响的行数
DB::update('UPDATE `member` SET `age`=\'20\' WHERE `name`=\'tom\'');
// 执行DELETE语句,返回受影响的行数
DB::delete('DELETE FROM `member` WHERE `name`=\'tom\'');
// 执行其他语句,如CREATE TABLE,返回true或false
DB::statement('CREATE TABLE `test` (`id` INT)');
注意:不建议直接执行SQL语句,使用Laravel封装的方法安全性高,避免SQL注入问题。
连接查询
普通连接查询SQL
SELECT t1.`id`, t1.`article_name`, t2.`author_name`
FROM `article` AS t1
LEFT JOIN `author` AS t2
ON t1.`author_id`=t2.`id`;
在框架中实现连接查询
public function database()
{
$data = DB::table('article AS t1')->select(
't1.id',
't1.article_name AS article_name',
't2.author_name AS author_name'
)->leftjoin(
'author AS t2',
't1.author_id', '=', 't2.id'
)->get();
foreach ($data as $v) {
echo $v->id . '-' . $v->article_name . '-' . $v->author_name;
}
}
使用模型操作数据库
初识模型
Laravel内置了Eloquent模型组件,使用该组件操作数据库。Eloquent模型采用对象关系映射(Object Relational Mapping,ORM)的设计思想。 ORM:用来在关系型数据库和对象之间做一个映射,它将数据库中的表作为类,表中的记录作为对象,表中的字段作为属性,使用ORM操作数据库和操作对象类似。

普通查询和使用Eloquent模型查询的区别:
// 普通查询方式
$sql = 'SELECT id,name FROM member WHERE id = 1';
$data = DB::select($sql);
$username = $data[0]->name;
// Eloquent模型查询
$member = Member::find(1);
$username = $member->name;
使用Eloquent模型操作数据库的优点: 不需要书写SQL语句,直接使用已经封装好的数据库操作就可以查询数据。 数据模型都统一定义,容易更新和维护,也利于代码重用。 ORM有封装好的工具,很多功能都可以自动完成,比如预处理、事务等。 业务代码比较简单,代码量少,语义性好,容易理解。
定义模型
创建Member模型:php artisan make:model Member
app\Member.php模型文件
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
//
}
在模型中指定表名:Laravel自动将Member模型名转换为表名,并使用复数形式,即members。也可以在模型中使用$table属性来指定表名。
class Member extends Model
{
protected $table = 'member';
}
模型类中的其他可选属性: protected $primaryKey:设置主键的名称,默认值为id,如果主键名称有误,会导致程序出错。 public $timestamps:是否自动维护时间戳,默认为true。设为true时,模型会自动维护表中的created_at(创建时间)和updated_at(更新时间)字段。 protected $fillable:允许某些字段可以被添加或修改,格式为一维数组形式。使用模型的create()方法添加数据时,需要设置$fillable。 protected $guarded:禁止某些字段被添加或修改,与$fillable只能二选一。
在控制器中使用模型
在控制器文件中引入模型的命名空间:
use App\Member;
模型的使用方式: 静态调用 实例化模型
// 方式1:静态调用
Member::get();
// 方式2:实例化模型
$member = new Member();
$member->get();
使用模型添加数据

save()方法 :先实例化模型,为模型的属性赋值,模型的属性对应数据表的字段,赋值完成后调用save()方法保存。
$member = new Member();
$member->name = 'save';
$member->age = '20';
$member->email = 'save@laravel.test';
dump($member->save()); // 保存数据
dump($member->id); // 获取自动增长id
fill()方法:以数组的方式填充数据,数组的键名对应字段名,填充后调用save()方法保存。
$data = ['name' => 'fill', 'age' => '20', 'email' => 'fill@laravel.test'];
$member = new Member();
$member->fill($data);
$member->save();
create()方法:在实例化模型的同时为模型填充数据,调用save()方法保存。
$data = ['name' => 'tom', 'age' => '20'];
$member = Member::create($data);
$member->save();
使用模型查询数据

find()方法:根据主键查询记录,如果数据不存在返回null。
// 查询主键为4的记录,返回模型对象
$member = Member::find(4);
dump($member->name); // 获取name字段的值
// 添加查询条件,返回name和age字段
$member = Member::where('name', 'tom')->select('name', 'age')->find(1);
dump($member);
// 查询主键为1、2、3的记录,返回对象集合
$members = Member::find([1, 2, 3]);
dump($members);
get()方法:与DB类的get()方法类似,两者的返回结果都是对象集合,但对象的类型不同。
模型的get()方法返回的是模型对象的集合。 DB类的get()方法返回的是普通对象的集合。
// 模型的get()方法
$members = Member::where('id', '1')->get();
dump(get_class($members[0])); // 输出结果:"App\Member"
// DB类的get()方法
$members = DB::table('member')->where('id', 1)->get();
dump(get_class($members[0])); // 输出结果:"stdClass"
all()方法:查询表中所有的记录,返回模型对象集合,all()方法前不能调用where()、select()方法。
// 查询所有记录,返回对象集合
$members = Member::all();
dump($members);
// 查询所有记录的name和age字段,返回对象集合
$members = Member::all(['name', 'age']);
dump($members);
使用模型修改数据
使用模型修改数据的两种方式: 先查询后保存,通常用于在保存前进行一些操作。 直接修改。
// 方式1:先查询后保存
$member = Member::find(4);
if ($member) {
$member->name = 'test';
$member->email = 'test@laravel.test';
$member->save();
} else {
dump('修改失败:记录不存在');
}
// 方式2:直接修改
Member::where('id', 4)->update(['name' => 'test', 'age' => 30]);
使用模型删除数据
使用模型删除数据的两种方式: 先查询后删除,通常用于在删除前进行一些操作。 直接删除。
// 方式1:先查询后删除
$member = Member::find(4);
if ($member) {
$member->delete();
} else {
dump('删除失败:记录不存在');
}
// 方式2:直接删除
$data = Member::where('id', 4)->delete();
dump($data);
关联模型的使用
一对一
当一篇文章只有一个作者时,文章和作者就是一对一的关系。 创建文章和作者模型:
php artisan make:model Article php artisan make:model Author
在Article模型建立一对一关联: hasOne()方法表示一对一,第1个参数表示被关联模型的命名空间,第2个参数表示被关联模型中的关系字段,第3个参数表示本模型中的关系字段
class Article extends Model
{
protected $table = 'article';
protected $timestamp = false;
public function author()
{
return $this->hasOne('App\Author', 'id', 'author_id');
}
}
在Author模型中配置表名:
class Author extends Model
{
protected $table = 'author';
protected $timestamp = false;
}
在TestController的test()方法中查询数据 文章作者的名字:
public function test()
{
$data = \App\Article::all();
foreach ($data as $key => $value) {
echo '文章id:' . $value->id . '<br>';
echo '文章名称:' . $value->article_name . '<br>';
echo '作者名称:' . $value->author->author_name;
}
一对一查询结果:
一对多
一位作者可以发表多篇文章,作者和文章就是一对多的关系。 在Author模型建立一对多关联:使用hasMany()方法建立一对多关系
public function article()
{
return $this->hasMany('App\Article', 'author_id', 'id');
}
在TestController的test()方法中查询数据:
public function test()
{
$data = \App\Author::all();
foreach ($data as $key => $value) {
echo '作者名称:' . $value->author_name . '<br>';
foreach ($value->article as $k => $v) {
echo $v->article_name . '<br>';
}
}
}
一对多查询结果:

多对一
将一对多的关系反过来,就是多对一的关系,使用belongsTo()方法建立多对一关系。 修改Article模型的author()方法,建立多对一关联:
public function author()
{
return $this->belongsTo('App\Author', 'author_id', 'id');
}
在TestController的test()方法中查询数据:
public function test()
{
$data = \App\Article::all();
foreach ($data as $key => $value) {
echo '文章id:' . $value->id . '<br>';
echo '文章名称:' . $value->article_name . '<br>';
echo '作者名称:' . $value->author->author_name;
}
}
多对多
一篇文章有多个关键词,一个关键词可以被多个文章使用,那么文章和关键词就是多对多的关系。 多对多可以拆分成两个一对多关系,两个一对多关系需要借助第3张表(中间表)来建立关系。 创建关键词表和中间表: 天龙八部 武侠, 动作 雪山飞狐 武侠
# 创建关键词表
CREATE TABLE `keyword` (
`id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`keyword` VARCHAR(255) NOT NULL COMMENT '关键词'
) DEFAULT CHARSET=utf8mb4;
# 创建中间表,保存文章和关键词的关联
CREATE TABLE `article_keyword` (
`id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`article_id` INT UNSIGNED NOT NULL COMMENT '文章id',
`keyword_id` INT UNSIGNED NOT NULL COMMENT '关键词id'
) DEFAULT CHARSET=utf8mb4;
在文章模型中使用belongsToMany()方法建立多对多关联。
public function keyword()
{
return $this->belongsToMany('App\Keyword', 'article_keyword',
'article_id', 'keyword_id');
}
第1个参数表示被关联模型的命名空间。 第2个参数表示中间表的表名。 第3个参数表示中间表中当前模型的关系字段。 第4个参数表示中间表中被关联模型的关系字段
在TestController的test()方法中查询数据:
public function test()
{
$data = \App\Article::all();
foreach ($data as $key => $value) {
echo '文章名称:' . $value->article_name . '<br>';
echo '关键词:';
foreach ($value->keyword as $k => $v) {
echo $v->keyword . ' ';
}
echo '<hr>';
}
}
使用文章模型查询关键词:

数据库的迁移和填充
数据表迁移
数据表迁移共分为两步: 第1步是创建迁移文件, php artisan make:migration create_student_table create_teacher_table create_score_table 第2步是执行迁移文件。 php artisan migrate 迁移文件的保存目录为database\migrations,命名方式为“时间版本_create_表名_table.php”。 php artisan make:migration create_hehe_table
创建迁移文件 创建迁移文件命令:
php artisan make:migration 迁移文件名
创建paper表迁移文件命令:
php artisan make:migration create_paper_table
paper表对应的迁移文件部分示例代码:
public function up()
{
Schema::create('paper', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
function down()
{
Schema::dropIfExists('paper');
}
paper表的字段要求: id:表的主键,自动增长。 paper_name:试卷名称,VARCHAR(100)类型,不允许重复值。 total_score:试卷总分,TINYINT类似,默认为0。 start_time:试卷开始考试时间,INT类型(保存时间戳)。 duration:考试时间长度,单位为分钟,TINYINT类型。 status:试卷是否启用,TINYINT类型,1表示启用,2表示禁用,默认为1。 created_at:创建时间,TIMESTAMP类型,默认为NULL。 updated_at:更新时间,TIMESTAMP类型,默认为NULL。
paper表字段对应的迁移代码:
Schema::create('paper', function (Blueprint $table) {
$table->increments('id')->comment('主键');
$table->string('paper_name', 100)->comment('试卷名称')->unique();
$table->tinyInteger('total_score')->default(0)->comment('试卷总分');
$table->integer('start_time')->comment('考试开始时间');
$table->tinyInteger('duration')->comment('考试时长');
$table->tinyInteger('status')->default(1)->comment('状态');
$table->timestamps();
});
执行迁移文件 在项目中第一次执行迁移文件时,需要安装迁移,安装迁移命令:
php artisan migrate:install
安装迁移后,生成migrations表保存迁移记录,migrations表字段: id:表的主键,用来唯一标识每条记录。 migration:用来记录执行过的迁移文件。 batch:用来记录批次,每次执行迁移命令,批次就会加1。如果在一次迁移命令中迁移了两张表,那么这两张表就属于同一个批次。
执行迁移命令:
php artisan migrate
回滚迁移命令:
php artisan migrate:rollback
数据表填充
1. 创建填充文件 填充文件又称为填充器、种子文件,创建命令:
php artisan make:seeder 填充器名称
创建paper表填充文件:
php artisan make:seeder PaperTableSeeder
PaperTableSeeder.php填充文件部分示例代码:
<?php
use Illuminate\Database\Seeder;
class PaperTableSeeder extends Seeder
{
public function run()
{
//
}
}
在run()方法中编写填充代码:
public function run()
{
DB::table('paper')->insert([
[
'paper_name' => 'PHP期末复习题',
'total_score' => 100,
'start_time' => time() + 86400,
'duration' => 120,
'status' => 1
],
……(添加更多数据)
]);
}
执行填充文件 执行PaperTableSeeder.php填充文件的命令:
php artisan db:seed --class=PaperTableSeeder
总结
本博客讲解了如何在Laravel框架中操作数据库,主要包括DB类操作数据库、模型操作数据库、关联模型,以及数据表的迁移和填充。通过学习本章的内容,希望读者能够掌握如何在Laravel框架中对数据库的操作,这在以后的项目开发中会频繁使用。
本文详细介绍了Laravel框架中数据库操作的基础和实例,包括使用DB类和模型进行增删改查,执行SQL,进行连接查询,以及一对一、一对多、多对多的关联模型操作。此外,还涵盖了数据表的迁移和填充,帮助开发者掌握在Laravel中高效操作数据库的技巧。

1642

被折叠的 条评论
为什么被折叠?



