Laravel学习过程之基础知识学习和使用(二)
二、学习和使用laravel
(一)、Laravel中的路由和MVC
1. 路由
l 路由简介
概念:简单地说就是讲用户的请求转发给相应的程序进行处理。
作用:建立URL与程序之间的映射。
请求类型:get、post、put、patch、delete。
l 基本路由
在APACHE服务器上的访问方式上去除index.php;
参考文档:
http://www.cnblogs.com/tianguook/p/3726457.html
get路由实例:
Route::get('basic1', function(){
return"Hello World!";
});
post路由实例:
Route::post('basic2', function(){
return"Hello World!!!";
});
l 多请求路由
多请求路由实例:
Route::match(['get', 'post'], 'multy1', function(){
return"multy1";
});
Route::any('multy2', function(){
return"multy2";
});
l 路由参数
路由参数实例:
Route::get('user/{id}', function($id){
return"User-id-".$id;
});
Route::get('user/{name?}', function(){
return"User-name-".$name;
});
Route::get('user/{name?}', function($name ='sean'){
return"User-name-".$name;
});
Route::get('user/{name?}', function($name ='sean'){
return"User-name-".$name;
})->where('name', '[a-zA-Z]+');
Route::get('user/{id}/{name?}',function($id, $name){
return"User-id-".$id."-name-".$name;
})->where(['id'=>'[0-9]+','name'=>'[a-zA-Z]+']);
l 路由别名
路由别名实例:
Route::get('user/member-center',['as'=>'center', function(){
returnroute('center');
}]);
l 路由群组
路由群组实例:
Route::group(['prefix'=>'member'],function(){
Route::get('multy2',function(){
return "member-multy2";
});
Route::get('center',['as'=>'center-alis', function(){
return route('center-alis');
}]);
});
l 路由中输出视图
路由中输出视图实例:
Route::get('view', function(){
return view('welcome');
});
解释:当返回内容是字符串时,相当于正常的路由输出字符串;当返回内容是view函数时,去resources/views中寻找view函数里面字符串对应的文件名文件,并显示其视图内容。
2. 控制器
l 怎么新建一个控制器
在app/Http/Controllers新建一个文件MemberController.php
并在文件中写命名空间和类及方法,实例如下:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info(){
return"member-info";
}
}
l 路由和控制器怎么关联
在app/Http/routes.php文件中添加一行代码,即是访问MemberController控制器的info方法,如下:
routes.php:
第一种方式:
Route::get('member/info','MemberController@info');
第二种方式:
Route::get('member/info', ['uses'=>'MemberController@info']);
MemberController.php:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info(){
return"member-info";
}
}
l 关联控制器后,路由的特性怎么用
路由别名:
routes.php:
Route::get('member/info', [
'uses'=>'MemberController@info',
'as'=>'memberinfo'
]);
MemberController.php:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info(){
//return "member-info";
returnroute('memberinfo');
}
}
路由参数:
routes.php:
第一种方式:
Route::get('member/{id}','MemberController@info')->where('id', '[0-9]+');
第二种方式:
Route::get('member/{id}',['uses'=>'MemberController@info'])->where('id', '[0-9]+');
MemberController.php:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info($id){
//return "member-info";
//return route('memberinfo');
return"member-info-id-".$id;
}
}
注意:5.2以上的laravel版本已经不支持Route::controller方式绑定控制器的方式!
3. 视图
l 怎样新建视图
在resources/views目录里可以新建视图;
新建member-info.php模板(视图)文件,并写内容,如下;
member-info php
MemberController.php控制器文件内容:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info($id){
//return "member-info";
//return route('memberinfo');
//return "member-info-id-".$id;
returnview('member-info');
}
}
routes.php路由文件内容:
// Route::get('member/{id}','MemberController@info')->where('id', '[0-9]+');
Route::get('member/{id}',['uses'=>'MemberController@info'])->where('id', '[0-9]+');
建立默认模板:
同样是在resources/views目录里可以新建视图(模板);
建立文件info.blade.php,并写入内容,如下:
路由内容同上;
控制器内容如下:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info($id){
//return "member-info";
//return route('memberinfo');
//return "member-info-id-".$id;
//return view('member-info');
returnview('info');
}
}
注意:默认模板(视图)文件名公共后缀为*.blade.php。
一般情况下,根据共同交叉内容会创建一个目录,目录里面放模板,一个模板对应一个控制器。
l 怎样输出视图
实例如下:
模板目录及内容(加参数输出)
member/info blade php
{{$name}}
{{$age}}
路由同上;
MemberController.php控制器文件内容:
<?php
namespace App\Http\Controllers;
class MemberController extends Controller {
publicfunction info($id){
//return "member-info";
//return route('memberinfo');
//return "member-info-id-".$id;
//return view('member-info');
//return view('info');
return view('member/info',[
'name' => '丁梦涛',
'age' => 18
]);
}
}
模板视图显示结果:
4. 模型
l 怎样新建模型
模型所在目录文件是:app,如User.php就是默认模型
在app目录下新建Member.php模型,内容如下:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
publicstatic function getMember(){
return "Member name is 丁梦涛。"
}
}
l 怎样输出模型
路由同上;
在控制器中调用模型:
在MemberController.php控制器文件中使用模型类名::模型方法,如Member::getMember(),实例如下:
<?php
namespace App\Http\Controllers;
use App\Member;
class MemberController extends Controller {
publicfunction info($id){
//return "member-info";
//return route('memberinfo');
//return "member-info-id-".$id;
//return view('member-info');
//return view('info');
//return view('member/info',[
// 'name' => '丁梦涛',
// 'age' => 18
//]);
return Member::getMember();
}
}
结果显示如下图:
Laravel中提供了DB façade(原始查找)、查询构造器、Eloquent ORM三种操作数据库的方式。
(二)、数据库操作之-DB facade
1. 新建数据表与连接数据库
l 新建数据库
可以使用phpmyadmin,也可以使用cmd控制台,连接数据库成功后,创建数据库laravel:
create database laravel charset=utf8;
选择要操作的数据库:
use lavarel;
l 新建数据表
CREATETABLE IF NOT EXISTS student(
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL DEFAULT ''COMMENT '姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0COMMENT '年龄',
`sex` TINYINT UNSIGNED NOT NULL DEFAULT 10 COMMENT '性别',
`created_at`INT NOT NULL DEFAULT 0 COMMENT '新增时间',
`updated_at`INT NOT NULL DEFAULT 0 COMMENT '修改时间'
)ENGINE=INNODB DEFAULT CHARSET = UTF8 AUTO_INCREMENT=1001 COMMENT='学生表';
注意:数据库配置在config/database.php文件和.env文件中。
修改.env文件中对应database.php的mysql数据库配置,如主机地址、端口号、数据库名、用户名、密码,具体根据自己的配置进修改。
2. 使用DB façade实现CURD
实例操作:
l 建立student控制器StudentController.php
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; class StudentController extends Controller { public function test1(){ // return "test1"; $student_row = DB::select('select * from student'); if ($student_row){ echo "查询到结果."; }else{ echo "查询结果为空!"; } echo "<pre>"; var_dump($student_row); } }
l 路由文件routes.php写访问StudentController控制器文件的路由
Route::any('test1', ['uses' =>'StudentController@test1']);
l 访问结果
l 插入(新增)数据
在StudentController控制器的test1方法中写如下内容:
$bool = DB::insert('insert into (name, age)VALUES (?,?)', ['丁梦涛',18]);
var_dump($bool);
访问结果:
说明插入数据成功。
l 修改数据
在StudentController控制器的test1方法中写如下内容:
$num = DB::update('update student set age=?where name=?',[20,'丁梦涛']);
var_dump($num);
访问结果:
说明修改成功。
l 查询数据
在StudentController控制器的test1方法中写如下内容:
$students_row = select('select * fromstudent');
echo “<pre>”;
var_dump($students_row);
访问结果:
说明查询成功。
l 删除数据
在StudentController控制器的test1方法中写如下内容:
$num = DB::delete('delete from studentwhere name=?',['丁梦涛']);
echo "<pre>";
var_dump($num);
访问结果显示:
说明删除一个,成功。
注意:删除的时候务必带上条件,否则可能造成数据丢失。
(三)、数据库操作之-查询构造器.
1. 查询构造器简介
l Lavarel查询构造器提供方便、流畅的接口,用来建立及执行数据库查找语法;
l 使用PDO参数绑定,以保护应用程序免于SQL注入,因此传入的参数不需要额外转义特殊字符;
l 基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行。
2. 使用查询构造器新增数据
Student的StudentController.php文件建立query1方法:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class StudentController extends Controller
{
// 查询构造器
public function query1(){
// 新增数据
$bool = DB::table('student')->insert(['name'=>'dingding','age'=>18]);
var_dump($bool);
}
}
路由routes.php:
//student查询构造器路由
Route::any('query1', ['uses' =>'StudentController@query1']);
l 仅插入数据:
在StudentController控制器的控制器的query1方法中写如下内容:
//新增数据
$bool =DB::table('student')->insert(['name'=>'dingding', 'age'=>18]);
var_dump($bool);
结果:
l 插入数据时获取自增的id:
在StudentController控制器的query1方法中写如下内容:
$id =DB::table('student')->insertGetid(['name'=>'mente', 'age'=>19,'sex'=>1]);
var_dump($id);
结果:
l 插入多条数据:
在StudentController控制器的query1方法中写如下内容:
$bool = DB::table('student')->insert([
['name'=>'ding', 'age'=>21, 'sex'=>0],
['name'=>'meng', 'age'=>22, 'sex'=>1],
['name'=>'tao', 'age'=>23, 'sex'=>0]
]);
var_dump($bool);
结果:
3. 使用查询构造器修改数据
l 更新为指定的内容
在StudentController控制器的query1方法中写如下内容:
$num = DB::table('student')->where('id',5)->update(['name'=>'sun']);
var_dump($num);
结果:
l 自增和自减
不带条件切默认自增(自减)时增减单位是1,且更新全部记录;
在StudentController控制器的query1方法中写如下内容:
$num =DB::table('student')->increment('age');
// $num = DB::table('student')->decrement('age');
var_dump($num);
结果(自增自减结果形式相同):
有条件自增(自减)时,仅更新满足条件的数据记录:
在StudentController控制器的query1方法中写如下内容:
$num = DB::table('student')->where('id',8)->increment('age');
// $num = DB::table('student')->where('id', 8)->decrement('age');
var_dump($num);
结果(自增自减形式相同):
有条件且自增(自减)时,同时自增自减单位自定义,同步更新数据的方式:
在StudentController控制器的query1方法中写如下内容:
$num = DB::table('student')->where('id',8)->increment('age', 3,['name'=>'fangfang']);
// $num = DB::table('student')->where('id', 8)->decrement('age',3,['name'=>'fangfang']);
var_dump($num);
结果(自增自减形式相同):
4. 使用查询构造器删除数据
l delete
在StudentController控制器的query1方法中写如下内容:
结果:$num = DB::table('student')->where('id', 1)->delete(); //一次删除多条记录: $num = DB::table('student')->where('id', ’<=’, 5)->delete(); var_dump($num);
truncate操作十分危险,是因为这是整表删除数据,且不可恢复,工作中谨慎使用!
在StudentController控制器的query1方法中写如下内容:
truncate不返回任何结果,即为删除成功。
DB::table('student')->truncate();
结果:
5. 使用查询构造器查询数据
l get()
获取数据表中的所有数据。
在StudentController控制器的query1方法中写如下内容:
$students = DB::table('student')->get();
dd($students);
结果:
l first()
获取数据表中的一条数据,第一条,
在StudentController控制器的query1方法中写如下内容:
$students =DB::table('student')->first();
或:
$students = DB::table('student')->orderBy(‘id’,‘desc)->first();
dd($students);
结果:
l where()
获取满足条件的所有数据。
StudentController控制器的query1方法中写如下内容:
$students =DB::table('student')->where('id', '>=', 2)->get();
dd($students);
结果:
多个条件:
StudentController控制器的query1方法中写如下内容:
$students =DB::table('student')->whereRaw('id > ? and age < ?', [2,21])->get();
dd($students);
结果:
l pluck()
获取结果集中所需的字段,同时第二个参数可以作为下标(lists方法也可以)。
StudentController控制器的query1方法中写如下内容:
$students = DB::table('student')->pluck(‘name’);
dd($students);
结果:
l lists()
同pluck功能相似,获取结果集中所需的字段,同时第二个参数可以作为下标(pluck方法也可以)。
StudentController控制器的query1方法中写如下内容:
$students =DB::table('student')->lists('name', 'id');dd($students);
结果:
l select()
获取数据表中指定的几个字段,而不是所有。
StudentController控制器的query1方法中写如下内容:
$students =DB::table('student')->select('id', 'name', 'age')->get();dd($students);
结果:
l chunk()
分段查找数据表中的数据(相当于分页),直到查出所有数据,参数1是每次查询条数,参数2是匿名函数。
StudentController控制器的query1方法中写如下内容:
DB::table('student')->chunk(2, function($students){
echo "<pre>";
var_dump($students);
});
结果:
6. 查询构造器中的聚合函数
l count()
获取数据表中记录数。
StudentController控制器的query1方法中写如下内容:
$num = DB::table('student')->count();
var_dump($num);
结果:
l max()
获取数据表中相应字段数据的最大值。
StudentController控制器的query1方法中写如下内容:
$max = DB::table('student')->max('age');
var_dump($max);
结果:
l min()
获取数据表中相应字段数据的最小值。
StudentController控制器的query1方法中写如下内容:
$min = DB::table('student')->min('age');
var_dump($min);
结果:
l avg()
获取数据表中相应字段数据的平均值。
StudentController控制器的query1方法中写如下内容:
$avg = DB::table('student')->avg('age');
var_dump($avg);
结果:
l sum()
获取数据表中相应字段数据的和。
StudentController控制器的query1方法中写如下内容:
$sum = DB::table('student')->sum('age');
var_dump($sum);
结果:
本系列的第三篇将讲解数据库操作的Equloment ORM内容,敬请关注。
****************************只要思想不滑坡,办法总比困难多****************************