基于5.1
零 、关闭debug
.env文件
APP_DEBUG=false
一、Laravel 数据库操作
1.1查询构建器(Query Builder)
- migrate
php artisan make:migration create_mail_table
php artisan make:migration create_users_table --create=users//指定表名
php artisan make:migration add_votes_to_users_table --table=users//创建表
php artisan migrate//执行
php artisan migrate:rollback//回滚
php artisan migrate:reset//回滚所有
php artisan migrate:refresh//reset then migrate
php artisan migrate:refresh --seed
//判断表、列是否存在
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
//其他db连接
Schema::connection('foo')->create('users', function ($table) {
$table->increments('id');
});
//存储引擎
Schema::create('users', function ($table) {
$table->engine = 'InnoDB';
$table->increments('id');
});
Schema::rename($from, $to);
//创建列
Schema::table('users', function ($table) {
$table->string('email');
});
//删除表
Schema::table('users', function ($table) {
$table->dropColumn('votes');
});
- 运行原生SQL查询
use DB;
......
......
DB::select('select * from users where id = :id', ['id' => 1]);
DB::select('select * from users where active = ?', [1]);
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
DB::update('update users set votes = 100 where name = ?', ['John']);
DB::delete('delete from users');
DB::statement('drop table users');
DB::table('users')->skip(10)->take(5)->get();
//事务
DB::beginTransaction();
DB::commit();
DB::rollBack();
//多个数据库连接
DB::connection('foo')->select(...);
1.2 Eloquent
- 创建模型 表(users)复数,模型(User)单数
php artisan make:model User
php artisan make:model Mail -m(生成mgration,用于表还没建立的情况)
laravel Models 文件夹、laravel model 指定路径
1、
- 目录结构
- app
- Console
- Events
- ...
- ** Models **
- app
2、composer.json
"psr-4": {
"App\\": "app/",
"App\\Models\\": "app/Models"
}
composer install
3、php artisan make:model Models/Task
生成的model在app\Models\,namespace App\Models;
- 主键默认id,指定主键用
$primaryKey
属性覆盖
protected $primaryKey = 'st_id';
- 默认期望有
create_at
、updated_at
,不需要就
public $timestamps = false;
- 自定义日期格式
protected $dateFormat = 'U';
- 一般查询
$tasks = Task::where('name', 1)
->orderBy('id', 'desc')
->take(10)
->get();
- 组块结果集
Task::chunk(200, function ($tasks) {
foreach ($tasks as $task) {
//
}
});
- Not found 异常
$task=Task::where('id',$request->id)->firstOrFail();//对应first()
$task=Task::findOrFail($id);//对应find()
- 聚合方法
$count = Task::where('active', 1)->count();
$max = ask::where('active', 1)->max('price');
- 创建新数据
$task=new Task;
$task->name='ok';
$task->save();
返回创建的对象
$task = Task::create(['name' => 'jin']);//前提在model里 protected $fillable = ['name'];
-
firstOrCreate
和firstOrNew
先尝试通过给定列/值对在数据库中查找记录,如果没有找到的话则通过给定属性创建一个新的记录。后者需要save显示保存
Task::firstOrCreate(['id'=>52,'name'=>'jin']);
Task::firstOrNew(['id'=>53,'name'=>'jin'])->save(s);
- 作用域 查询的通用集合,用于代码复用
//model里
public function scopeBigId($query,$id)
{
return $query->where('id', '>', $id);
}
//调用
$a=Task::bigId(20)->orderBy('name')->get();
- 模型事件
- 关联关系
- 一对一
/** * 父模型-User * 第二个参数为重写【子模型】指定外键(默认为user_id) * 【父模型】主键不是id,则通过第三个参数重写 */ public function mail() { return $this->hasOne('App\Mail', 'foreign_key', 'local_key'); } /** * 子模型-Mail * 第二个参数为重写【子模型】指定外键(默认为user_id) * 【父模型】主键不是id,则用第三个参数指定 */ public function user() { return $this->belongsTo('App\User', 'foreign_key', 'other_key'); }
- 一对多类似
- 多对多
user,role,role_user为相关表,中间表按照关联模型名的字母顺序命名(r在u前面),且包含user_id和role_id。如果想要指定关联表和两个外键:
return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
```
class User extends Model{
/**
* 用户角色
*/
public function roles()
{
return $this->belongsToMany('App\Role');
}
。。。
}
class Role extends Model{
/**
* 角色用户
*/
public function users()
{
return $this->belongsToMany('App\User');
}
}
```
>访问中间表属性`pivot`
```
$user = App\User::find(1);
foreach ($user->roles as $role) {
echo $role->pivot->created_at;
}
```
- 访问器 修改器
> 访问器会修改访问的属性值($task->name),但不会修改attribute,修改器会
public function getNameAttribute($value)
{
return '经过访问器:' . $value;
}
public function setIdAttribute($value)
{
$this->attributes['id'].=$value;
}
----
## Middleware
- ### 1.1新建
`php artisan make:middleware OldMiddleware`
请求之前
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 执行动作
return $next($request);
}
}
请求之后
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 执行动作
return $response;
}
}
注册
// 在 App\Http\Kernel 里中
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,];
Route::get('admin/profile', ['middleware' => 'auth', function () {
//
}]);
验证认证用户是否拥有指定的角色,可以创建一个RoleMiddleware
来接收角色名作为额外参数
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
//
}]);
在控制器中使用
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => ['fooAction', 'barAction']]);
$this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}