laravel
1.laravel 安装与目录介绍
1.1 laravel 安装
- 通过 composer 指令安装
composer create-project laravel/laravel
- laravel 7.2 版 安装 PHP 版本 必须大于 7.2.5
1.2 目录介绍
关于网站创建 网站的根目录 一定要选择 laravel 中的 public 目录,否则 laravel 无法运行
关于时间戳 laeavel 默认为国外时区 需要修改为中国时区
- 打开 config/app.php 文件 找到
'timezone' => 'UTC',
修改为'timezone' => 'Asia/Shanghai',
即可
- 打开 config/app.php 文件 找到
vendor 目录 是整个框架的类库 不要去修改
我们应该把注意力放到 app 目录 route 目录
1.3 路由
laravel 中所有的请求 必须走路由 不走路由访问不了
比如我们想访问 www.xxx.xxx/admin 直接访问会 404
- 我们需要打开 routes/web.php 文件 添加路由
Route::get('/admin', function () {
return view('admin');
});
- 然后去 resources/views 中创建 admin.blade.php 文件
- 此文件即为 admin 正确访问的目录
1.4. database 目录
- 初学者不要动!
1.5. app 目录
此目录包含应用程序的核心代码。你应用中几乎所有的类都应该放在这里
laravel 是一个 mvc 框架 m = model v = view c = controller
m 默认不提供
v 放在 resources/views
c 放在 app/http/controllers
1.6 其他文件
.env 保存着 laravel 的配置 比如数据库用户名密码等 在这里面修改
artisan 运行该命令 创建 控制器 等等 …
- 编辑器打开 终端 输入
php artisan make:controller admin
创建 admin 控制器
2. mvc 流程分析
- 路由文件 routes/web.php
Route::get('/', function () {
return view('welcome');
});
第一个值为请求地址 , 默认第二个值为回调函数
view(welcome) 视图 resources/views 中的 welcome.blade.php
blade 为视图引擎
laravel 根据文件名判断此文件是否需要加载视图引擎
如果要转到一个类
Route::get('/admin/index',"Home@index");
- 第二个参数为控制器中的 类名称@类中方法
使用 artisan 创建控制器
G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:controller Home
Controller created successfully.
- successfully 表示创建成功
在 home 控制器中创建 index 方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Home extends Controller
{
public function index(){
return view("test");
}
}
在 view 视图中创建 index.blade.php 视图文件
注意一定要是一个 php 文件 这样才能调用 blade 引擎 在里面使用一些 laravel 的快捷 php 函数,后续会讲到
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test.blade.php</title>
</head>
<body>
<span>这是一个test视图</span>
</body>
</html>
那么访问 /admin/index 则会显示 index.blade.php 中的内容
当然 我们也可以在 index 方法中向 test.blade.php 中传递参数
- view 中支持第二个参数 为数组 数组中的键名 为 传递过去的参数名
比如
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Home extends Controller
{
public function index(){
// 传递第二个参数
return view("test",['user'=>"PHP中文网"]);
}
}
视图中调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test.blade.php</title>
</head>
<body>
<span>这是一个test视图</span>
{{-- 调用数组传过来的参数--}}
<p style="color: red;"><?php echo $user ?></p>
</body>
</html>
- 传递多个参数
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class Home extends Controller
{
public function index(){
// 传递多个参数
$data['user'] = "php中文网";
$data['id'] = 11110 ;
return view("test",$data);
}
}
视图中调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test.blade.php</title>
</head>
<body>
<span>这是一个test视图</span>
{{-- 调用数组传过来的参数--}}
<p style="color: red;"><?php echo $user ?></p>
<p style="color: red;"><?php echo $id ?></p>
</body>
</html>
3.数据库的使用
3.1 连接数据库
打开 .env 文件
将这部分修改为自己的数据
DB_CONNECTION=mysql //数据库类型
DB_HOST=127.0.0.1 // 数据库地址
DB_PORT=3306 // 端口号
DB_DATABASE=php11.edu // 数据库名称
DB_USERNAME=php11.edu // 数据库账号
DB_PASSWORD=php11.edu // 数据库密码
3.2 原生操作
- 直接使用 laravel 定义的 DB 类操作 不需要 newPDO 什么什么的
以下演示方法均放在 Home 类中
// 首先use DB
use \DB;
查询
public function select(){
$res = DB::select('select * from staffs');
print_r($res);
}
添加路由 routes/web.php
Route::get('/dbselect' , "Home@select");
访问
将数据带到视图中输出 注意这个返回的是 一维数组 里面是对象 所以要强制转换为数组
public function staff(){
$res = DB::select('select * from staffs');
$list = [];
foreach ($res as $val){
$list[] = (array)$val;
}
$data['list'] = $list;
return view("staffs",$data);
}
创建视图 resources/views/staff.blade.php
里面的@foreach 是 laravel 调用模板引擎解析文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工列表</title>
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body>
<table class="layui-table">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>position</th>
<th>mobile</th>
<th>hiredate</th>
</tr>
</thead>
<tbody>
@foreach($list as $val)
<tr>
<td>{{$val['id']}}</td>
<td>{{$val['name']}}</td>
<td>{{$val['age']}}</td>
<!-- 男女 判断一下 -->
<td>{{$val['sex']?"男":"女"}}</td>
<td>{{$val['position']}}</td>
<td>{{$val['mobile']}}</td>
<!-- 时间戳转为日期 -->
<td>{{date("Y-m-d h:i:s",$val['hiredate'])}}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>
访问
更新
public function update(){
$res = DB::update('select * from staffs');
var_dump($res);
}
添加路由 routes/web.php
Route::get('/dbupdate' , "Home@update");
访问 返回受影响的条数
增加
DB::insert()
返回布尔值 true 插入成功 false 插入失败
删除
DB::delete()
返回受影响条数
3.3 链式调用
查询
public function select(){
//sql = select * from staffs where id=8
$res = DB::table('staffs')->where("id","8")->first();
print_r($res);
}
返回的是一个对象
``
- 查询 所有数据
public function select(){
$res = DB::table('staffs')->get();
print_r($res);
}
返回的是集合对象 为受保护的值 无法直接调用
所以要调用 all 方法
public function select(){
$res = DB::table('staffs')->get()->all();
print_r($res);
}
- 如果我们想只取出部分字段
public function select(){
$res = DB::table('staffs')->select("id","name")->get()->all();
print_r($res);
}
- 也可以给字段名改个名字 比如 把 id 改为 userid
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->get()->all();
print_r($res);
}
- 只查询某条数据 加 where
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("id","7")->get()->all();
print_r($res);
}
- 如果想查询 id>8 的值呢?
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("id",">","7")->get()->all();
print_r($res);
}
但是不要用 对 mysql 不友好 数据过多会卡死
- lick 方法 查询条数据中带有某某的数据
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->get()->all();
print_r($res);
}
也是尽量不要用 对性能有一定影响 做好做缓存
- and 方法
比如 我只想取出 id 为 8 的数据
链式调用 后面再加条件即可
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->get()->all();
print_r($res);
}
转为 sql 语句
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->tosql();
// select `id` as `userid`, `name` from `staffs` where `name` like ? and `id` = ?
print_r($res);
}
- or 方法
比如我只想取出 id 为 8 和 18 的值
Orwhere
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->orWhere("id","18")->get()->all();
print_r($res);
}
- wherein
查询的时候想做 多条数据的查询
public function select(){
$res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->whereIn("id",[8,18,33,43])->get()->all();
print_r($res);
}
- 连表查询
public function select(){
$res = DB::table('staffs')->join("users","users.id","=","staffs.uid")->select('staffs.id',"users.name")->get()->all();
print_r($res);
}
- 计算
取员工年龄的平均值
public function select(){
$res = DB::table('staffs')->avg("age");
print_r($res); // 51.1076
// 转为整数
$res = (int)$res;
print_r($res); //51
}
取总数
public function select(){
$res = DB::table('staffs')->sum("age");
print_r($res);//16150
}
最小值
public function select(){
$res = DB::table('staffs')->min("age");
print_r($res);//23
}
最大值
public function select(){
$res = DB::table('staffs')->max("age");
print_r($res);//99
}
记录数
public function select(){
$res = DB::table('staffs')->count();
print_r($res);//316
}
增加
public function insert(){
// 传入数组
// $res = DB::table('staffs')->insert(['name'=>'daxiguai','age'=>11,'sex'=>0,'position'=>'啥进度的基督教','mobile'=>15865656565,'hiredate'=>time()]);
// 多条数据 这样写
$date[] = ['name'=>'daxiguai','age'=>11,'sex'=>0,'position'=>'啥进度的基督教','mobile'=>15865656565,'hiredate'=>time()];
$date[] = ['name'=>'daxigssssss','age'=>11,'sex'=>0,'position'=>'啥进度55686教','mobile'=>18555888565,'hiredate'=>time()];
$res = DB::table('staffs')->insert($date);
var_dump($res); //返回布尔值
}
- 如果需要返回被插入数据的 id
- insertGetId()
public function insert2(){
$date = ['name'=>'daxigssssss','age'=>11,'sex'=>0,'position'=>'啥进度55686教','mobile'=>18555888565,'hiredate'=>time()];
$res = DB::table('staffs')->insertGetId($date);
var_dump($res); // int(418)
}
修改
public function update(){
$res = DB::table('staffs')->where('id','418')->update(["name"=>"更新测试"]);
var_dump($res); // int(1) 返回受影响的行数
}
- 若要修改多个 whereIn
public function update(){
$res = DB::table('staffs')->whereIn('id',[416,417])->update(["name"=>"更新ghenxgin 试"]);
var_dump($res); // int(2) 返回受影响的行数
}
删除
public function delete(){
$res = db::table('staffs')->whereIn('id',[416,417])->delete();
var_dump($res);// int(2) 返回受影响的行数
}
4. 模型
4.1 创建模型
- 使用 artisan 命令
G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:model Staff
Model created successfully.
自动创建到了 app 目录下
4.2 模型的使用
一些开发者把应用的「模型」称为其所有业务逻辑的总体,而另一些人将「模型」称为与关系数据库交互的类。
而 laravel 则倾向于后者 将模型称为与关系数据库交互的类
So:
查询数据直接调用模型即可
public function select2(Staff $staff){
$res = $staff->get()->ToArray();
echo "<pre>";
print_r($res);
}
模型如果使用
all()
方法返回的是一个类, 故这里要使用ToArray()
方法
默认情况下 模型查询的数据表为该模型类名的复数
- 如
Staff
模型 查询staffs
数据表
- 如
我们可以修改他默认的关联数据表
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Staff extends Model
{
protected $table = "staffs";
}
protected $table = "***";
- 这是一个固定写法 并给他赋值
5.blade 模板引擎
- 当 views 中的文件名加上
***.blade.***
时 将会调用 blade 引擎解析该文件 并保存到storage/framework/views
中 - 所以这里可以使用 laravel 中的某些快捷语法
例如 @foreach
=> php 中的 foreach
```php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工列表</title>
<link rel="stylesheet" href="layui/css/layui.css">
</head>
<body>
<table class="layui-table">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>position</th>
<th>mobile</th>
<th>hiredate</th>
</tr>
</thead>
<tbody>
@foreach($list as $val)
<tr>
<td>{{$val['id']}}</td>
<td>{{$val['name']}}</td>
<td>{{$val['age']}}</td>
<!-- 男女 判断一下 -->
<td>{{$val['sex']?"男":"女"}}</td>
<td>{{$val['position']}}</td>
<td>{{$val['mobile']}}</td>
<!-- 时间戳转为日期 -->
<td>{{date("Y-m-d h:i:s",$val['hiredate'])}}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>
这就是 laravel 的 blade 语法
- 流程控制
@if(***<***)
{{ $uesr }}
@else
{{ $dd }}
@endif
- 关于变量的显示
如果直接在{{}}中输入的变量值中有 html 源码 则回原样输出
这样写 {!!$user!!}
即可解决此问题
- 如果想在 html 中原样输出{{}},这样写
@{{}}
6. 中间件
- 通常有些页面需要登陆后才可以显示
所以我们需要用到他
需要在执行该方法之前做一个判断
中间件执行逻辑
6.1 创建中间件
使用 artisan 命令
G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:middleware Index
Middleware created successfully.
源码
<?php
namespace App\Http\Middleware;
use Closure;
class Index
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
handle
此方法为固定写法, 在这里可以做一些判断Closure
闭包$requset
包含了所有的请求信息
- 中间件使用步骤 创建->注册->触发
- 上面已经完成了创建,接下来注册
6.2 注册中间件
打开 app/Http/kernel.php 文件 注册中间件
第一个为 所有请求都要使用该中间件
第二个为 路由组使用
第三个为 自定义调用该中间件
注册到第三个中'index'=> \App\Http\Middleware\Index::class,
6.3 触发中间件
到路由中找到需要该中间件的指令后面加一个方法 middleware()Route::get('/dbselect2',"Home@select2")->middleware("index");
总结
所有的编辑器都会有报错!不要先怀疑自己的代码有没有问题,先去运行一下,可能并没有问题,只是编辑器误报。