học laravel 5

Bài 7 : Sử dụng Eloquent trong Laravel 5

Tiếp theo bài viết trước nói về Migrations, hôm nay mình tiếp tục hướng dẫn các bạn về cách sử dụng Eloquent trong Laravel 5.  Trước khi bước vào học cách sử dụng Eloquent trong Laravel 5, thì chúng ta hãy tìm hiểu sơ lược về Eloquent cái đã.

Eloquent trong Laravel 5 là gì ?

Eloquent trong Laravel 5 chính là một ORM (Object-relational mapping), cung cấp các ActiveRecord đơn giản nhưng vô cùng chuyên nghiệp, giúp chúng ta làm việc với cơ sở dữ liệu thuận tiện hơn.

Hay nói 1 cách khác cho các bạn dễ hình dùng thì thế này. Như ở ví dụ trong bài trước, chúng ta có tạo bảng gọi là articles, dùng để chứa dữ liệu là các bài viết. Vậy thì chúng ta sẽ có thể đóan được các tương tác gì sẽ xảy ra với bảng articles này? Có phải chính là thêm, xóa, cập nhật và truy vấn đúng không nào? Và với Eloquent trong Laravel 5, nó đã xây dựng sẵn các phương thức để chúng ta làm điều đó, giúp cho việc sử dụng database trở nên dễ dàng hơn bao giờ hết.

Hướng dẫn sử dụng Eloquent trong Laravel 5

Để hiểu rõ về Eloquent, thì chúng ta hãy bắt tay vào nghiên cứu nó nào.

Trước khi sử dụng eloquent, thì chúng ta hãy nhìn lại một tí về bảng articles mà chúng ta đã tạo ở bài trước.

public function up()
	{
    		Schema::create('articles', function(Blueprint $table)
   		{
			    $table->increments('id');
    			$table->string('name'); //thêm cột name
			    $table->string('author'); // thêm cột author
    			$table->timestamps();
		   });
	}

Vào trong phpmyadmin, bạn sẽ thấy bảng articles này bao gồm các cột như sau:

laravel 5, bảng articles

Tiếp đến, mình sẽ sử dụng php artisan tạo ra một lớp model gọi là Articles sẽ kế thừa class Eloquent model, nhằm thừa hưởng sức mạnh tương tác của lớp Eloquent này với database của chúng ta, mà ở đây chính là bảng articles.

Để tạo ra class Articles kế thừa class Eloquent, mình sẽ gõ lệnh sau :

php artisan make:model Articles

và bạn sẽ nhận được thông báo tạo thành công như dưới đây:

articles eloquent

Đồng thời vào thư mục app của Laravel, bạn sẽ thấy một file model mới gọi là Articles.php có nội dung như sau:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Articles extends Model {

	//

}

Ở đoạn code chút xíu trên, rõ ràng là các bạn dễ dàng thấy được rằng class Articles kế thừa lớp Eloquent Model và cũng chỉ cần bao nhiêu dòng code như vậy thôi là đủ để bạn sử dụng sức mạnh ActiveRecord để thao tác thêm, xóa, sửa với bảng articles. Bạn có thể xem sơ qua lớp Model này để hiểu hơn bằng cách tìm file Model.php ở đường dẫn sau

laravel-5\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

. Mở file này lên bạn sẽ thấy các function đại loại như là find(), update(), save(),…đây chính là các phương thức đã được xây dựng sẵn giúp cho ta tương tác với database dễ dàng và hiệu quả hơn.

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

OK,giải thích thì dài dòng, trăm nghe không bằng thực hành (liên quan vãi :v), mình sẽ thử thao tác thêm, xóa, sửa bảng articles để các bạn hình dung nhé. Mình sẽ dùng php artisan tinker xuyên suốt quá trình demo cho các bạn, đây đơn giản chỉ là một tool của php artisan để giúp chúng ta tương tác với Laravel. (Bạn có thể xem đầy đủ các tính năng mà php artisan hỗ trợ bằng cách gõ lệnh php artisan ).

Vào vấn đề chính nào, bạn gõ dòng lệnh sau để bắt đầu sử dụng php artisan tinker

php artisan tinker

Gõ dòng lệnh trên xong, bạn sẽ thấy hiện ra như dưới đây là bạn đã vào chương trình của php artisan tinker

php artisan tinker

Tiếp đến, gõ thử tiếp vài dòng lệnh để làm quen với php artisan tinker nào. Gõ tiếp như dưới đây

>>> $name = 'Hieu'

bạn sẽ thông báo trả về là ‘Hieu’, điều này có nghĩa là biến $name đã lưu giá trị ‘Hieu’. Không tin các bạn thử gõ tiếp lệnh này để xem giá trị của biến $name.

>>> $name

Bạn sẽ thấy kết quả trả về là ‘Hieu’.

Trên đây chỉ là demo cho các bạn nắm được cách tương tác của php artisan tinker đối với ứng dụng Laravel của chúng ta.

Giờ thì chúng ta thử tương tác với class Articles mà chúng ta vừa tạo nào. Gõ tiếp lệnh dưới đây để khởi tạo đối tượng $articles.

$articles = new App\Articles

Bạn sẽ thấy trong cmd hiện ra thông tin đối tượng $articles như sau:

php-artisan-tinker-articles

Có thể bạn quan tâm: Tặng coupon 40% giá trị khóa học tạo website với Laravel 5

1. Thêm 1 record mới vào database

Như chúng ta đã biết thì bảng articles trong database bao gồm các fields như là name, author, created_at,…Giờ mình sẽ thử thêm 1 record mới vào bảng này, các bạn gõ từng lệnh sau:

>>> $articles->name = "blablabla"
>>> $articles->author = "Hieu"

Giờ thì gõ dòng lệnh dưới đây

>>> $articles->toArray();

để đưa đối tượng $articles ra dạng mảng, và bạn sẽ thấy được thông tin một cách rõ ràng

[
   "author" => "Hieu"
   "name"   => "blablabla"
]

Tiếp đến, gõ như sau để sử dụng phương thức save() của class Model mà mình nhắc đến ở trên để thêm 1 record mới vào db.

>>> $articles->save();

nếu thấy trả về true là bạn đã thêm record mới thành công. Để kiểm chứng, các bạn vào database (phpmyadmin), xem bảng articles sẽ thấy có 1 record mới được thêm vào.

2. Truy vấn dữ liệu trong database

Để truy vấn dữ liệu trong DB thì bạn gõ

>>> $articles = App\Articles::find(1)

để sử dụng phương thức find($param) với tham số $param truyền vào là id của record (ở đây là số 1).

Giờ thì gõ tiếp

>>> $aritcles->toArray();

bạn sẽ thấy chúng ta đã lấy được record vừa thêm vào thông qua id là 1

3. Cập nhật thông tin record vừa tạo

Ở bước 2, sau khi đã lấy được thông tin của record vừa tạo, bạn gõ tiếp lệnh sau để thay đổi giá trị trong cột author

>>> $articles->author = 'Nam'

Cập nhật xuống db

>>> $articles->update();

Vào bảng articles trong db bạn sẽ thấy thông tin author từ ‘Hieu’ đã được chuyển thành ‘Nam’

4.Xóa record trong db

Ở bước 2 khi mà chúng ta đã lấy được record hiện hành, giờ mình muốn xóa đi record này thì đơn giản chạy function delete() như sau:

>>> $articles->delete();

Vào trong db, record vừa thêm vào bảng articles đã bị xóa đi.

Tổng kết : Bài viết này mình không liệt kê hết đầy đủ những tính năng của Eloquent, vì mục đích của bài viết này là mình muốn giới thiệu cho các bạn hiểu được Eloquent trong Laravel 5 là gì ? Và nó hoạt động ra sao ? Cách nó tương tác thêm, xóa, sửa với database như thế nào. Bạn có thể tìm hiểu nhiều hơn về Eloquent trong Laravel 5 tại trang chủ của Laravel http://laravel.com/docs/5.0/eloquent . Trong bài tiếp theo mình sẽ hướng dẫn các bạn mô hình MVC (Model, Controller, View)  trong Laravel 5 và cách dữ liệu được truyền đi trong mô hình MVC đó như thế nào. Chúc các bạn học tốt.

Xem thêm : Khóa học tạo website hoàn chỉnh với Laravel 5 tặng mã giảm giá 40% + Hỗ trợ việc làm sau khi học xong

Nguồn : kungfuphp.com

Có ích

học laravel 5

Bài 8 : Form trong Laravel 5

Ở bài trước, mình đã hướng dẫn cho các bạn về mô hình MVC trong …

33 bình luận

  1. Mình có 1 custom model như sau:

    namespace App\Models;
    use Illuminate\Database\Eloquent\Model;
    // use Illuminate\Support\Facades\DB;
    class Test extends Model
    {
    private $_prefix = ‘_prefix’;

    public function __construct(array $attributes = array())
    {
    // parent::__construct($attributes);
    $this->_prefix = ‘abc_’;
    }

    public static function custom_table(){
    return $this->_prefix.’table_name’;
    }

    }

    Controller gọi
    Test::custom_table() // error Using $this when not in object context

    Có bác nào biết cách fix lỗi ?
    Thanks & Regards

  2. Add giúp mình cái này. Mình có bảng tochuctindung: matctd, tentctd, diachitctd. Minh Delete thi nó báo unknown tochuctindung.id.
    Lỗi nằm ở đâu vậy add? cách khắc phục add giúp mjh. minh mới tìm hiểu laravel. Cảm on add

  3. a ơi e gõ tới bước $articles= new App\Articles rồi thì nó trả về =>App\Articles{#663} thì là lỗi gì vậy a?

  4. mình dùng migration thì thấy có tác động tới DB nhưng sao xài cái này hoặc use DB; lại ko đc ?

    PDOException in Connector.php line 55:
    SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES)
    in Connector.php line 55
    at PDO->__construct(‘mysql:host=127.0.0.1;port=3306;dbname=dich_vu_an_uong’, ‘root’, ‘11111’, array(‘0’, ‘2’, ‘0’, false, false)) in Connector.php line 55
    p/s : trên mạng thấy toàn chỉ cách sửa password của ‘root’ trong khi ở đây mình nhập đúng hết mà, dùng migration nó cũng tạo table trong DB bình thường mà ?

  5. em bị làm theo hương dẫn nhưng khi gõ lệnh save() thì thông báo lỗi và chưa biết khắc phục thế nào
    Illuminate\Database\QueryException with message ‘SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘author’ in ‘field list’ (SQL: insert into `ar
    ticles` (`name`, `author`, `updated_at`, `created_at`) values (Hieu, Bla bla Bla, 2016-03-04 14:32:26, 2016-03-04 14:32:26))’

  6. Ad cho em hỏi tý được không ạ? Em dùng hàm Auth::attempt($user) để kiểm tra đăng nhập. Em tin chắc rằng e đã nhập đúng Username và Password nhưng hàm attempt luôn trả về sai. Ad đã từng gặp trường hợp này chưa ạ? Giúp e với, chúc page thành công!

  7. cho mình hỏi về relation một chút:
    mình có 1 bảng ngôn ngữ: languages(id, name, …), 1 bảng bài viết posts(id, image, status …) và bảng relation giữa chúng là post_lang(post_id, lang_id, post_title, post_slug, content….)
    bây giờ mình muốn lấy tất cả bài viết query từ bảng posts: Post::with(‘langs’)….. và sắp xếp theo post_title trong bảng post_lang (bảng pivot) thì viết ntn a. thank all

  8. Anh nên thêm làm thế nào để exit tinker console luôn ạ, để mọi người trong quá trình thao tác theo có thể xuyên suốt các bài với nhau ạ. Chúc anh luôn mạnh khỏe để viết thêm nhiu bài viết thật hay nữa ạ.

  9. cho hỏi làm cách này có lợi gì hơn, t thấy vào csdl làm mấy việc này nhanh gọn hơn

  10. Các bác cho em hỏi chút tại sao em dùng cái findOrFail thì nó báo là Method not found in model

  11. Kungfu PHP cho mình hỏi:
    Nếu mình tạo được table : articles và users, nếu mình artisan:rollback thì nó sẽ xóa cái nào ?
    Nếu mình đặt cụ thể để rollback table cần rollback nó có được hôm ?

    Ví dụ như: mình tạo table: users trước, rồi tạo tiếp cái articles, dĩ nhiên rollback nó sẽ xóa articles, nếu mình muốn rollback users mà k phải articles thì sao ^^

  12. Bạn cho mình hỏi chỉnh lại giờ cho đúng gmt+7 của VietNam ở 2 trường created_at và updated_at ở đâu nhỉ?

  13. bạn cho mình hỏi mình tạo table trên database bằng php myadmin hoắc sql server nhưng sau đó mình muốn add nó vào laravel,như đã được tạo bởi migration để có thể sử dụng eloquent có được ko vậy,mình thử tạo một table trên phpmyadmin ,nhưng mà thử tạo một model có tên trùng tables đó nhưng khi thử add thêm dữ liệu thì báo lỗi

    • bạn add dữ liệu như thế nào ? Post code lên mình xem thử

      • mình chưa code ấy.mình có bài tập lớn về thiết kế web bằng laravel để quản lý hội nhạc sĩ.mjnhf định tạo ra csdl trước cho cả nhóm làm mẫu.nhưng thao tác với nó trên laravel ko dùng eloquent haymigration thì hơi phí

        • Bản chất thì Eloquent chỉ là 1 tool để bạn có thể thêm, xóa, sửa dữ liệu trong database như là mysql thay vì phải vào trực tiếp bên trong phpmyadmin để chỉnh. Nếu như bạn đã có sẵn cơ sở dữ liệu trong phpmyadmin rồi, thì bạn cứ việc kết nối tới và sử dụng. Bạn để ý ở trên, mình có file model Articles.php, file này chính là đại diện cho bảng articles trong databse. Giờ giả sử như trong trường hợp của bạn, bạn đã có database là bảng baiviet trong database, thì bạn chỉ việc tạo một file Baiviet.php có nội dung đại loại như sau :

          https://kungfuphp.com/laravel-framework-5/mo-hinh-mvc-trong-laravel-5.html

          • mình có thử làm như bạn mình tạo table baiviet trong database là tranglata xong mình thử dùng php arstian tinker để tạo xem có thêm dữ liệu không thì nó lại bảo là mình insert dữ liệu vào bảng baiviets có thêm chữ s ở sau nên ko tìm thấy,mình thử mấy lần khác thì đều như thế,bạn biết lỗi ko :3
            Illuminate\Database\QueryException with message ‘SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘tranglata.baiviets’ doesn’t exist (SQL: insert into `baiviets
            (`maso`, `tenbaiviet`, `updated_at`, `created_at`) values (2, 3, 2015-04-01 13:47:46, 2015-04-01 13:47:46))’
            >>>

        • mình có thử làm như bạn mình tạo table baiviet trong database là tranglata xong mình thử dùng php arstian tinker để tạo xem có thêm dữ liệu không thì nó lại bảo là mình insert dữ liệu vào bảng baiviets có thêm chữ s ở sau nên ko tìm thấy,mình thử mấy lần khác thì đều như thế,bạn biết lỗi ko :3
          Illuminate\Database\QueryException with message ‘SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘tranglata.baiviets’ doesn’t exist (SQL: insert into baiviets
          (maso, tenbaiviet, updated_at, created_at`) values (2, 3, 2015-04-01 13:47:46, 2015-04-01 13:47:46))’
          >>>

          Bạn paste câu lệnh SQL mà bạn dùng để insert mình xem thử

          • câu lệnh thì như trên :insert into baiviets
            (maso, tenbaiviet, updated_at, created_at`) values (2, 3, 2015-04-01 13:47:46, 2015-04-01 13:47:46))’
            nhưng mình dùng php artisan tinker add theo lệnh giống như trên của bạn

        • theo lỗi nó thông báo ra thì là nó ko hiểu bảng “baiviets” có s của bạn. Trong khi trong db lại là bảng “baiviet”, hmm, giờ chỉ còn cách là thử đổi tên “baiviet” thành “baiviets” trong db xem sao :p

          • bạn phải định nghĩa biến $table trong model nếu muốn bỏ chữ s đi ví dụ trường hợp của bạn thì thêm dòng $table = ‘baiviet’ vào trong model, cũng như primary key mặc định của nó là ” id ” nên nếu muốn truy cập bằng tên khác thì thêm $primaryKey = ‘abc_id’

  14. Mình exit ra ngoài rồi tạo bảng mà báo lỗi [RuntimeException] Too many arguments . mình đã chạy fresh và cả config:clear rồi mà vẫn vậy? Giúp mình với! Cảm ơn bạn!

  15. Cho mình hỏi là trong khi đang thao tác trong tinker. Làm cách nào để trở về thao tác với php artisan vậy? Cụ thể là trong ví dụ này, mình quên chưa tạo bản articles trong DB nên khi đến phần thêm dữ liệu vào bảng mình muốn thoát ra để tạo bảng articles rồi mới thao tác tiếp. Mong bạn giúp đỡ! Cảm ơn bạn!

Trả lời quandev1992 Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *