0

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ề ControllerModel 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

Screenshot_17.png

Đâ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'    => '',
        ),
  1. 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' => '[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


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.