响应

字符串 数组

返回一个字符串

1
2
3
Route::get('/', function () {
return 'Hello World';
});

数组会被转化为json响应

1
2
3
Route::get('/', function () {
return [1, 2, 3];
});

Response 对象

1
2
3
4
Route::get('home', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});

添加响应头

1
2
3
4
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');

添加Cookie

1
2
3
return response($content)
->header('Content-Type', $type)
->cookie('name', 'value', $minutes);

重定向

1
2
3
Route::get('dashboard', function () {
return redirect('home/dashboard');
});

重定向到路由

1
return redirect()->route('login');

路由中如果有参数

1
return redirect()->route('profile', ['id' => 1]);

重定向到控制器

1
return redirect()->action('HomeController@index');

重定向到控制器带参数

1
2
3
return redirect()->action(
'UserController@profile', ['id' => 1]
);

重定向外部域名

1
return redirect()->away('https://www.google.com');

视图

视图存放在resources/views中。

1
2
3
4
5
6
7
<!-- 此视图文件位置 resources/views/greeting.blade.php -->

<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
1
2
3
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});

可以用.来引用更深目录下的视图,例如视图文件在resources/views/admin/profile.blade.php,那么路由可以是

1
return view('admin.profile', $data);

判断视图是否存在

1
2
3
4
5
use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
//
}

数据库

数据库的配置都在config/database.php

使用原生查询

1
$users = DB::select('select * from users where active = ?', [1]);

select返回一个数组,数组值都是StdClass对象,可以这样访问:

1
2
3
foreach ($users as $user) {
echo $user->name;
}

使用命名绑定

1
$results = DB::select('select * from users where id = :id', ['id' => 1]);

插入语句

1
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

更新语句返回受影响行数

1
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

删除语句返回受影响行数

1
$deleted = DB::delete('delete from users');

如果不需要语句返回任何值

1
DB::statement('drop table users');

事务

如果使用DB::transaction,闭包中出现异常就会回滚,执行成功后会自动提交。

1
2
3
4
5
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);

DB::table('posts')->delete();
});

事务处理死锁

transaction第二个参数表示事务发生死锁后重复执行的次数,尝试完毕后悔抛出异常。

1
2
3
4
5
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);

DB::table('posts')->delete();
}, 5);

手动事务

1
2
3
DB::beginTransaction();
DB::rollBack();
DB::commit();

查询构造器

获取一个表中的所有行

1
2
3
4
$users = DB::table('users')->get();
foreach ($users as $user) {
echo $user->name;
}

只获取一行

1
2
$user = DB::table('users')->where('name', 'John')->first();
echo $user->name;

不要整行数据,只取一个值

1
$email = DB::table('users')->where('name', 'John')->value('email');

只取一列的值,不知道能干啥

1
2
3
4
5
$titles = DB::table('roles')->pluck('title');

foreach ($titles as $title) {
echo $title;
}

聚合

1
2
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');

聚合方法可以和其他查询语句组合

1
2
3
$price = DB::table('orders')
->where('finalized', 1)
->avg('price');

判断记录是否存在

1
2
3
return DB::table('orders')->where('finalized', 1)->exists();

return DB::table('orders')->where('finalized', 1)->doesntExist();

select

1
$users = DB::table('users')->select('name', 'email as user_email')->get();

distinct会让查询结果不重复

1
$users = DB::table('users')->distinct()->get();

可以使用addSelect向已经有的查询条件里增加条件

1
2
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();

原生表达式

使用DB::raw创建一个原生表达式

1
2
3
4
5
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();

原生方法

可以使用selectRaw代替DB::raw()

1
2
3
$orders = DB::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();

可以使用whereRaw和orWhereRaw`来使用原生的where。

1
2
3
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();

可以使用havingRaworHavingRaw来使用原生的having语句。

1
2
3
4
5
$orders = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();

可以使用orderByRaw来使用原生order by语句

1
2
3
$orders = DB::table('orders')
->orderByRaw('updated_at - created_at DESC')
->get();

join

1
2
3
4
5
6
7
8
9
10
11
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
$users = DB::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();

where

where通常三个参数,第一个是字段名,第二个是数据库系统支持的运算符,第三个是要比较的值。

1
$users = DB::table('users')->where('votes', '=', 100)->get();

如果只判断相等,只需要两个参数。

1
$users = DB::table('users')->where('votes', 100)->get();

也支持其他运算符。

1
2
3
4
5
6
7
8
9
10
11
$users = DB::table('users')
->where('votes', '>=', 100)
->get();

$users = DB::table('users')
->where('votes', '<>', 100)
->get();

$users = DB::table('users')
->where('name', 'like', 'T%')
->get();

where也支持传入条件数组

1
2
3
4
$users = DB::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();

使用orWhere来接受or条件

1
2
3
4
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();

使用whereBetween来判断between条件。

1
2
$users = DB::table('users')
->whereBetween('votes', [1, 100])->get();

相反的是whereNotBetween

1
2
3
$users = DB::table('users')
->whereNotBetween('votes', [1, 100])
->get();

whereInwhereNotIn

1
2
3
4
5
6
$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();

whereNullwhereNotNull来判断值是不是null

1
2
3
4
5
6
$users = DB::table('users')
->whereNull('updated_at')
->get();
$users = DB::table('users')
->whereNotNull('updated_at')
->get();

插入

1
2
3
4
5
6
7
8
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,可以使用insertGetId来插入并返回id值。

1
2
3
$id = DB::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);

更新

1
2
3
DB::table('users')
->where('id', 1)
->update(['votes' => 1]);

updateOrInsert会尝试根据第一个参数提供的键值对匹配数据,如果存在则按照第二个参数更新,如果不存在则按照第二个参数插入。

1
2
3
4
5
DB::table('users')
->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);

可以使用->来更新json对象对应的值,要求mysql>5.7。

1
2
3
DB::table('users')
->where('id', 1)
->update(['options->enabled' => true]);

自增自减

1
2
3
4
5
6
7
DB::table('users')->increment('votes');

DB::table('users')->increment('votes', 5);

DB::table('users')->decrement('votes');

DB::table('users')->decrement('votes', 5);

可以在自增或自减同时进行更新。

1
DB::table('users')->increment('votes', 1, ['name' => 'John']);

删除

1
2
3
DB::table('users')->delete();

DB::table('users')->where('votes', '>', 100)->delete();

truncate会清空数据表,并重置自增id。

1
DB::table('users')->truncate();

分页

使用paginate来指定每页多少个数据。

1
$users = DB::table('users')->paginate(15);

其他具体的在ORM里弄你。