Laravel 常用操作

基于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 **

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_atupdated_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'];
  • firstOrCreatefirstOrNew
    先尝试通过给定列/值对在数据库中查找记录,如果没有找到的话则通过给定属性创建一个新的记录。后者需要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']]);
}

你可能感兴趣的:(Laravel 常用操作)