目录
1.简介
Laravel 支持原生的 SQL 查询、流畅的查询构造器 和 Eloquent ORM等三种方式。
目前 Laravel 支持以下四种数据库:
- MySQL 5.6+
- PostgreSQL 9.4+
- SQLite 3.8.8+
- SQL Server 2017+
2.测试环境准备
2.1 phpstudy
这里使用的是最新的phpstudy8.1。
2.2 php
使用phpstudy默认开启的php7.3.4nts版本。
(1)TS(Thread-Safety):即线程安全,多线程访问时,采用了加锁机制,PHP以 ISAPI 方式(Apache 常用方式)加载的时候选择TS版本。
(2)NTS(None-Thread Safe):即非线程安全,不提供数据访问保护,一般操作的执行时间要比 TS 短。PHP以FAST-CGI方式加载运行的时候选择TNS版,具有更好的性能;
(3)ISAPI(Internet Server Application Programming Interface):通常是指被http服务器所加载,以服务器的模块形式运行。
(4)CGI(Common Gateway Interface):HTTP服务器与客户端机器上的程序进行“交谈”的一种工具。此时的php是作为一个独立的程序运行的,特点就是耗费内存。
(5)FAST-CGI:是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一个新进程。FAST-CGI 较CGI 减少了进程的重复创建的资源占用。
2.3 laravel框架
使用最新的laravel8.x框架。它的安装和配置请查看本人另外两篇博客文章:
【老姐学PHP】PHP框架lavarel之环境搭建_语冰的老夏虫的博客-优快云博客
【老姐学PHP】PHP框架lavarel之api接口_语冰的老夏虫的博客-优快云博客
2.4 数据库
这里测试使用数据库mysql5.6。
(1)新建数据库
创建数据表“px_user_score_log” 的sql语句如下:
#
# Structure for table "px_user_score_log"
#
DROP TABLE IF EXISTS `px_user_score_log`;
CREATE TABLE `px_user_score_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户 id',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`action` varchar(50) NOT NULL DEFAULT '' COMMENT '用户操作名称',
`score` int(11) NOT NULL DEFAULT '0' COMMENT '更改积分,可以为负',
`coin` int(11) NOT NULL DEFAULT '0' COMMENT '更改金币,可以为负',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COMMENT='用户操作积分等奖励日志表';
#
# Data for table "px_user_score_log"
#
INSERT INTO `px_user_score_log` VALUES (1,4,1615344758,'login',1,1),(2,4,1615366463,'login',1,1),(3,4,1615429715,'login',1,1),(4,4,1616466886,'login',1,1),(6,4,1616743251,'login',1,1),(7,4,1617005416,'login',1,1),(8,4,1617010474,'login',1,1),(9,4,1617158613,'login',1,1),(10,4,1617346752,'login',1,1),(56,1000,1111111,'test1',66,2),(57,1000,1111111,'test1',66,2),(58,1000,1111111,'test1',66,2),(59,1000,1111111,'test1',66,2),(60,2000,22222,'test2',34,3),(61,2001,22221,'test2_1',12,3),(62,2001,22221,'test2_1',12,3),(63,2001,22221,'test2_1',12,3),(64,2001,22221,'test2_1',12,3);
(2)修改文件.env
laravel数据库连接主要需要进行修改的配置文件是.env , 和config文件夹下的database.php。如果只有.env.example文件,将.env.example复制一份命名成.env就可以了。
如果配置文件config\database.php的配置项使用了env函数,那么如果.env文件中配置了该选项,则使用.env文件里的值,否则使用配置文件设置的默认值。
一般修改.env文件不会立即有效,必须重启网站服务或执行php artisan serve才会有效。
3.原生的 SQL 查询
一旦配置好数据库连接后,便可以使用 DB facade 门面运行查询。DB facade 为每种类型的查询提供了相应的方法:select,update,insert,delete 和 statement。
3.1 新建文件UserController.php
执行在命令行中执行如下代码,自动生成控制器的类文件。
// 创建控制器
php artisan make:controller UserController
// 或创建Rest风格资源控制器(带有index、create、store、edit、update、destroy、show方法)
php artisan make:controller UserController --resource
注意:通过如下的命令,可以创建模型的时候同时生成新建表的迁移+控制器+路由。
php artisan make:model Order -m -c -r
上面自动生成的文件保存至文件夹:D:\Microsoft\phpstudy_pro\WWW3\blog\app\Http\Controllers
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
//
}
添加自己的数据库操作的逻辑代码如下:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class UserController extends Controller {
public function query()
{
$student=DB::select("select * from px_user_score_log where id < 10");
//var_dump($student);
//dd()是laravel提供的方法,可以将一个数组以节点树的形式展示出来。
//dd($student);
$json = json_encode(array(
"result"=>200,
"message"=>"登录成功!",
"data"=>$student
),JSON_UNESCAPED_UNICODE);
echo($json);
}
public function add()
{
$bool=DB::insert("insert into px_user_score_log(user_id,create_time,action,score,coin)
values(?,?,?,?,?)",[1000,1111111,'test1',66,2]);
var_dump($bool);
}
public function delete($id)
{
$num=DB::delete('delete from px_user_score_log where id= ?',[$id]);
echo $num;
}
public function update()
{
$bool=DB::update('update px_user_score_log set score= ? where id= ? ',[78,55]);
echo $bool;
}
}
3.2 修改文件api.php
D:\Microsoft\phpstudy_pro\WWW3\blog\routes
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::group(['prefix'=>"users"],function() {
//Route::prefix('users')->group(function () {
Route::get('query', [UserController::class,'query']);
Route::get('add', [UserController::class,'add']);
Route::get('delete/{id}', [UserController::class,'delete']);
Route::get('update', [UserController::class,'update']);
});
3.3 浏览器测试
http://localhost/api/users/query
4. 流畅的查询构造器
Laravel 的查询构造器使用 PDO 参数绑定的形式,保护您的应用程序免受 SQL 注入攻击。因此不必清理因参数绑定而传入的字符串。
4.1 从一个数据表中获取所有行
public function getAll3()
{
$users = DB::table('px_user_score_log')->get();
//return view('user.index', ['users' => $users]);
foreach ($users as $user) {
echo $user->id;
echo ",";
}
return $users;
}
4.2 从数据表中获取单行或单列
public function getSingleRow3()
{
$user = DB::table('px_user_score_log')->where('user_id', '4')->first();
return $user;
}
4.3 获取一列的值
public function getSingleColumn3()
{
$titles = DB::table('px_user_score_log')->pluck('action');
foreach ($titles as $title) {
echo $title;
echo ",";
}
}
4.4 判断记录是否存在
public function exists()
{
return DB::table('px_user_score_log')->where('user_id', 1000)->exists();
}
5. Eloquent ORM
Laravel 自带的 Eloquent ORM 为您的数据库提供了一个优雅的、简单的 ActiveRecord 实现。每一个数据库的表有一个对应的 "Model" 用来与这张表交互。
Eloquent ORM - Laravel - 为 WEB 艺术家创造的 PHP 框架。
5.1 新建模型文件User2.php
执行在命令行中执行如下代码,自动生成模型的类文件User2.php。
php artisan make:model User2
上面自动生成的文件保存至文件夹:D:\Microsoft\phpstudy_pro\WWW3\blog\app\Models,
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User2 extends Model
{
use HasFactory;
}
添加自己的代码,修改如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User2 extends Model{
//指定表名
protected $table = 'px_user_score_log';
//指定主键
protected $primaryKey = 'id';
//laravel会默认维护created_at,updated_at两个字段
public $timestamps = false;
//create方法新增
protected $fillable=['user_id','create_time','action','score','coin'];
public function getDateFormat()
{
return time();
}
}
5.2 修改控制器文件UserController.php
D:\Microsoft\phpstudy_pro\WWW3\blog\app\Http\Controllers
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Models\User2;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
class UserController extends Controller {
//Eloquent ORM 结构生成器
public function query2(){
// 1、查询所有数据
$users=User2::all();
//dd($users);
// 2、查询一条,依据主键查询。findOrFail()查找不存在的记录时会抛出异常
//$users=User2::find(6); //id=6
//var_dump($users['attributes']);
// 3、查询构造器的使用,省略了指定表名
//$users=User2::get();
//var_dump($users);
return $users;
}
public function add2()
{
/*$users = new User2();
$users->user_id=2000;
$users->create_time=22222;
$users->action='test2';
$users->score=34;
$users->coin=3;
$bool=$users->save(); //保存
echo $bool;*/
User2::create(['user_id'=>2001,'create_time'=>22221,'action'=>'test2_1','score'=>12,'coin'=>3]);
}
public function del2()
{
$affectedRows = User2::where('score', '=', 2)->delete();
var_dump($affectedRows);
}
public function update2(Request $request)
{
//http://localhost:9090/api/users/update2?score=60
$param = $request->input('type_id');
// dd($param);
$affectedRows = User2::where('user_id', '>', 500)->update(['score' => $param]);
var_dump($affectedRows);
}
}
5.3 修改路由文件api.php
D:\Microsoft\phpstudy_pro\WWW3\blog\routes
use App\Http\Controllers\UserController;
Route::group(['prefix'=>"users"],function() {
Route::get('query2', [UserController::class,'query2']);
Route::get('add2', [UserController::class,'add2']);
Route::get('del2', [UserController::class,'del2']);
Route::get('update2', [UserController::class,'update2']);
});
5.4 浏览器测试
http://localhost/api/users/query2
当前也可以通过第三方工具postman进行测试。
问题:laravel错误1071 Specified key was too long; max key length is 1000 bytes
解决:运行php artisan migrate之后可能会出现以上问题,和Laravel 、MySql的字符编码有关系,
在文件AppServiceProvider.php中添加如下代码:
use Illuminate\Support\Facades\Schema;
/*** Bootstrap any application services.**
@return void
*/
public function boot()
{ Schema::defaultStringLength(191);}
后续
如果你觉得该方法或代码有一点点用处,可以给作者点个赞;╮( ̄▽ ̄)╭
如果你感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
谢谢各位童鞋们啦( ´ ▽ ` )ノ ( ´ ▽ ` )っ!!!