Laravel 的 三种与数据库交互的方式:
- 原生sql
- 查询构造器
- ORM
原生sql
$results = DB::select('select * from users where id = :id', ['id' => 1]);
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
$deleted = DB::delete('delete from users');
总结:查询不够灵活,没有分页的封装,但在运行统计sql的时候好用。
查询构造器
Laravel 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。
Laravel 的查询构造器使用 PDO 参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串
例如 : 查询获取所有
$orders = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->where('id','>',100)
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();
自带的分页器:
$users = User::where('votes', '>', 100)->paginate(15);
插入
DB::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
DB::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
$id = DB::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);
更新:
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);
删除;
DB::table('users')->where('votes', '>', 100)->delete();
总计:方法传统,当去取值复杂的时候,没啥优化方案。
ORM
Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。。他是简化版本的doctrine.
首先你要先定义一个modle类,来映射这个数据模型才可以使用。但是,DB查询构造器是不需要模型的。
主要是可以用查询构造器中的方法,来组建查询。如:
// 通过主键取回一个模型...
$flight = App\Flight::find(1);
// 取回符合查询限制的第一个模型...
$flight = App\Flight::where('active', 1)->first();
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->get();
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->paginate(15);
插入
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
更新
$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();
删除
$flight = App\Flight::find(1);
$flight->delete();
和查询构造器的结合;
User::query()->from('user as u')->select()->leftJoin()->where()->orderBy()->paginate();
或者
$qb = User::query()->from('user as u')->select();
$qb->leftJoin();
if($name){
$qb->where();
}
$qb->when();
$qb->with();
$users = $qb->orderBy()->paginate();
ORM输出的结果集可以用资源类来输出如:
/**
* 将资源转换成数组。
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$brand = $this->brand;
$category = $this->category;
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
'category_name' => $category ? $category->category_name : '',
'brand_name' => $brand ? $brand->brand_name : '',
];
}
结果查询 n+1 问题。。
->with(['author', 'publisher'])
->with('author.contacts')
实际的优化;
1,把需要的查询的表先 ->leftjoin()连起来 1.在select()中把需要的字段写好,2.把查询语句的索引优化,3,用with()结果n+1问题
网友评论