TÌM HIỂU LARAVEL FRAMEWORK 4.X (P2)
Ở Phần 1, chúng ta đã đề cập về Routing và View trong Laravel Framework Phần 2 này chúng ta sẽ tìm hiểu về Controller và Model trong Lavarel Framwork. Tham khảo tại http://laravel.com/docs/4.2/controllers I. Tìm hiểu về Controller Để thao tác với controller, trước hết bạn cần tạo ...
Ở Phần 1, chúng ta đã đề cập về Routing và View trong Laravel Framework
Phần 2 này chúng ta sẽ tìm hiểu về Controller và Model trong Lavarel Framwork.
Tham khảo tại http://laravel.com/docs/4.2/controllers
I. Tìm hiểu về Controller
Để thao tác với controller, trước hết bạn cần tạo trong thư mục app/controllers một file theo cơ chế:
TênController.php. Ví dụ: UserController.php
Đây là ví dụ lớp controllers cơ bản
class UserController extendsBase Controller{
/**
* Show the profile for the given user.
*/
public function showProfile($id){
$user =User::find($id);
return View::make('user.profile', array('user'=> $user));
}}
Tất cả những lớp controllers đều được mở rộng từ lớp BaseController. Lớp BaseController cũng được lưu trữ trong thư mục app/controllers. Bạn có thể route tới action controllers như sau
trong file route. ta có thể gọi .
Route::get('user/{id}', '[email protected]');
Controllers với filters
Bạn có thể khai báo trên file route như sau
Route::get('profile', array('before' => 'auth','uses' => '[email protected]'));
Tuy nhiên thì filter cũng có thể khai báo bên trong controller
class UserController extends BaseController{
/**
* Instantiate a new UserController instance.
*/
public function __construct(){
$this->beforeFilter('auth', array('except'=>'getLogin'));
$this->beforeFilter('csrf', array('on'=>'post'));
$this->afterFilter('log', array('only'=>
array('fooAction','barAction')));
}}
Nếu bạn muốn sử dụng một phương thức khác làm filter thì ban có thể thêm @ để định nghĩa filter
class UserController extends BaseController {
/**
* Instantiate a new UserController instance.
*/
public function __construct()
{
$this->beforeFilter('@filterRequests');
}
/**
* Filter the incoming requests.
*/
public function filterRequests($route, $request)
{
//
}
}
RESTFUL Controllers
Laravel cho phép bạn sử dụng một route đơn mà xử lý mọi action trong controller
Route::controller('users', 'UserController');
Phương thức controller chấp nhận 2 đối số, đối số thứ nhất là đường dẫn URI, đối số thứ 2 là tên lớp của controller
class UserController extends BaseController{
public function getIndex()
{
//
}
public function postProfile()
{
//
}
}
Phương thức index sẽ được làm việc khi trên trình duyệt ta gõ users. Nếu bạn muốn sử dụng nhiều từ trong tên của controller action thì khi truy cập trình duyệt thêm dấu “-” vào. vd: users/admin-profile .
public function getAdminProfile() {}
Resource Controllers
Để lập một controller qua câu lệnh command line, thì ta thực hiện
php artisan controller:make PhotoController
Bây giờ bạn có thể đăng lý một resourceful route tới controller
Route::resource('photo', 'PhotoController');
Việc lập route đơn này sẽ xử lý nhiều route của RESTful actions trên nguồn photo.
Dưới đây là bảng ánh xạ giữa route và action
Verb | Path | Action | Route Name |
---|---|---|---|
GET | /resource | index | resource.index |
GET | /resource/create | create | resource.create |
POST | /resource | store | resource.store |
GET | /resource/{resource} | show | resource.show |
GET/resource/{resource}/edit | /resource/{resource}/edit | edit | resource.edit |
PUT/PATCH | /resource/{resource} | update | resource.update |
DELETE | /resource/{resource} | destroy | resource.destroy |
Ngoài ra thì bạn có thể giới hạn được những action nào được thực thi
Route::resource('photo', 'PhotoController',array('only' => array('index', 'show')));
Route::resource('photo', 'PhotoController',array('except' => array('create', 'store', 'update')));
**
II. Model trong Laravel**
Laravel kết nối tới cơ sở dữ liệu và chạy truy vấn cực kỳ đơn giản. Cấu hình nằm tại file app/config/database.php. Trong file này thì định nghĩa tất cả những loại kết nối cơ sở dữ liệu.
Hiện tại thì Laravel hổ trợ những hệ thống cơ sở dữ liệu sau: MySQL, Postgres, SQLite, và SQL Server.
Đôi lúc chúng ta chỉ muốn kết nối tới cơ sở dữ liệu sử dụng câu lệnh SELECT, INSERT, UPDATE, và DELETE. Những việc này đối với Laravel thật sự là đơn giản, ngoài ra còn có raw queries, query builder, hay Eloquent ORM.
Kết nối Database trong Laravel
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'laravel',
'username' => 'root',
'password' => ',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => ',
),
- Query Builder trong laravel
Query Builder giúp ta trong việc thao tác cỡ sở dữ liệu một cách thuận lợi hơn, giao diện của nó thân thiện để tạo và chạy những truy vấn từ CSDL.
khi mà bạn đã kết nối cơ sở dữ liệu, bạn có thể chạy câu lệnh truy vấn sử dụng lớp DB.
Class DB của Laravel hỗ trợ select, insert, update, delete thông thường.
// Chạy một câu lệnh truy vấn, Phương thức select luôn trả về một mảng kết quả
1. $results = DB::select('select * from users where id = ?', array(1));
//câu lệnh insert
2. DB::insert('insert into users (id, name) values (?, ?)', array(1, 'Tuan'));
//câu lệnh update
3.
DB::update('update users set votes = 100 where name = ?', array('Huy'));
//câu lệnh delete
4. DB::delete('delete from users');
//Ghi chú: Câu lệnh insert và câu lệnh delete luôn trả về con số record bị ảnh hưởng
Với các câu lệnh khác thì ta sẽ dử dụng hàm statement của class DB
vd: DB::statement('drop table users');
Select All , Truy vấn tất cả những hàng từ một bảng CSDL
$users = DB::table('users')->get();
foreach($users as $user){
var_dump($user->name);
}
//Truy vấn một cột từ một hàng đơn
$user = DB::table('users')->where('name','John')->first();
var_dump($user->name);
//Truy vấn danh sách từ 1 bảng giá trị
$roles = DB::table('roles')->lists('title');
//Sử dụng mệnh đề select
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
//Thêm mệnh đề select tới một query
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
//Sử dụng từ khóa where
$users=DB::table('users')->where('votes','>',100)->get();
//Hoặc câu lệnh
$users = DB::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
//Sử dụng where between
$users = DB::table('users')
->whereNotBetween('votes', array(1, 100))->get();
//Sử dụng where trong một mảng
$users = DB::table('users')
->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users')
->whereNotIn('id', array(1, 2, 3))->get();
//Sử dụng where với giá trị null hoặc có giá trị trả về nhưng lại không đặt giá trị
$users = DB::table('users')
->whereNull('updated_at')->get();
//Order By, Group By, và Having
users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();
//Offset & Limit
$users = DB::table('users')->skip(10)->take(5)->get();
Joins
Câu lệnh join cơ bản
DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.id', 'contacts.phone', 'orders.price');
**
Câu lệnh Left join**
DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
Join tùy biến
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
Nếu bạn muốn sử dụng “where” trong mệnh đề join, bạn có thể sử dụng phương thức where và orwhere trong mệnh đề join.
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
Mênh đề wheres nâng cao
DB::table('users')
->where('name', '=', 'John')
->orWhere(function($query)
{
$query->where('votes', '>', 100)
->where('title', '<>', 'Admin');
})
->get();
// output : select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
Câu lệnh tồn tại
DB::table('users')
->whereExists(function($query)
{
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
//sql output: select * from users where exists (select 1 from orders where orders.user_id = users.id)
Hàm
Trong Laravel cũng có những hàm trong SQL như
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes')
Raw Expressions
Trong một số trường hợp ta cần sử dụng mã SQL nguyên mẫu trong loạt truy vấn của mình. Laravel cung cấp cho bạn phương thức
DB::raw
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
Tăng hoặc giảm giá trị của một cột
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
Câu lệnh inserts , Chèn một hàng giá trị vào 1 bảng
DB::table('users')->insert(
array('email' => '[email protected]', 'votes' => 0)
);
Nếu bảng có id tự động tăng, thì ban dùng insertGetId để chèn và và lấy Id
$id = DB::table('users')->insertGetId(
array('email' => 'j[email protected]', 'votes' => 0)
);
Thêm nhiều records vào một bảng
DB::table('users')->insert(array(
array('email' => '[email protected]', 'votes' => 0),
array('email' => '[email protected]', 'votes' => 0),
));
Câu lệnh Updates
DB::table('users')
->where('id', 1)
->update(array('votes' => 1));
Câu lênh Deletes, Xóa 1 record tại một bảng
DB::table('users')->where('votes','<',100)->delete();
Xóa toàn bộ record trên bảng
DB::table('users')->delete();
Xóa nội dung của bảng
DB::table('users')->truncate();
Câu lệnh Union
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
Tham khảo:
http://laravel.com/docs/4.2