{//学习心得//}Laravel框架:数据库操作【基础】与【实例】

本文详细介绍了Laravel框架中数据库操作的基础和实例,包括使用DB类和模型进行增删改查,执行SQL,进行连接查询,以及一对一、一对多、多对多的关联模型操作。此外,还涵盖了数据表的迁移和填充,帮助开发者掌握在Laravel中高效操作数据库的技巧。

文章目录

  前言

  数据库的创建与配置

  使用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框架中对数据库的操作,这在以后的项目开发中会频繁使用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值