0

[Laravel 5.5] Eloquent: Getting Started

Giới thiệu :face_with_monocle:

Eloquent ORM trong Laravel cung cấp cung cấp một cách đẹp đẽ và đơn giản các ActiveRecord cho việc làm việc với database . Mỗi database table có tương ứng một "Model", cái được sử dụng để tương tác với database. "Model" đồng ý cho việc query dữ liệu từ trong bảng cũng như chèn thêm các dữ liệu mới vào trong bảng.

Định nghĩa các Model

  • Để bắt đầu, đầu tiên chúng ta sẽ tạo 1 Eloquent model. Thông thường "models" sẽ được tạo trong thư mục app, nhưng bạn có thể đặt chúng ở bất cứ đâu, nó được auto-loaded dựa vào file composer.json của bạn.
  • Mọi Eloquen models đều được kế thừa từ class Illuminate\Database\Eloquent\Model
  • Các tạo model dễ nhất là sử dụng câu lệnh make:model của artisan command. :love_you_gesture:
php artisan make:model User
  • Nếu bạn muốn generate một database migration tương ứng khi generate model, cộng thêm tham số --migration hoặc -m:
php artisan make:model  User --migration
php artisan make:model User -m 

Eloquent Model Conventions

  • Giờ chúng ta sẽ nhìn vào ví dụ Flight model, cái chúng ta tạo ra để lưu trữ thông tin từ bảng fligths của database: :man_raising_hand:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

Table Names

  • Chú ý rằng chúng ta không nói cho Eloquent là bảng nào sẽ được sử dụng cho Fight Model. Theo convention (tạm hiểu là theo quy ước), "snake case" số nhiều sẽ được sử dụng làm tên bảng trừ trường hợp một cái tên khác được chỉ ra một cách rõ ràng. Như vậy, ở cây này Flight model sẽ lưu dữ thông tin các record của bảng flights. Tuy nhiên, bạn có thể custom table bởi thuộc tính table trong model: :man_detective:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_flights';
}

trong ví dụ trên thì Flight model sẽ tương ứng với bảng my_flights trong database, chứ không còn tương ứng với flights

Primary Keys

  • Mặc định, primary key của mỗi table sẽ được đặt tên là id, có thể custom bằng từ khóa $primaryKey
  • Mặc định, primary key của mỗi table là dữ liệu kiểu integer và tự động tăng. Nếu muốn custom gía trị và kiểu của primary key, thì bạn cần set thuộc tính $incrementing (public) là false , như vậy, primary key sẽ có thể không phải là số, hoặc không tự động tăng. Trong trường hợp primary key không phải là một số kiểu integer, thì ta cần set thuộc tính $keyType(protected) của model thành kiểu string

Timestamps

  • Theo mặc định , Eloquent sẽ thêm created_atupdated_at vào các bảng của bạn. Nếu bạn không muốn làm điều này, hãy set $timestamps trong model thành false :skull_crossbones:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;
}
  • Nếu bạn cần tùy biến format của timestamps, hãy set $dateFormat trong model. sẽ dụng format sẽ lưu dữ một cách rõ ràng định dạng JSON
  • Nếu bạn muốn tùy biến tên của timestamps hãy sử dụng các hằng CREATED_AT, UPDATED_AT
<?php

class Flight extends Model
{
    const CREATED_AT = 'creation_date';
    const UPDATED_AT = 'last_update';
}

Như vậy thì trong Flight model, sẽ tồn tại 2 cột creation_datelast_update, chứ không phải mặc định là created_atupdated_date

Database Connection :man_construction_worker: 💃

  • Mặc định, mọi Eloquent models sẽ sử dụng default connection được cấu hình trong app của bnạ. Nếu bạn thích một cái gì đó khác người , :man_running:, sử dụng $connection property:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The connection name for the model.
     *
     * @var string
     */
    protected $connection = 'connection-name';
}

Truy xuất trong database

  • Khi bạn đã tạo database , bạn có thể truy xuất dữ liệu như sau:
<?php

use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
    echo $flight->name;
}

Thêm điều kiện lọc...v..v

$flights = App\Flight::where('active', 1)
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

Collections

  • Các phương thức all, get sẽ truy xuất được nhiều kết qủa trở về, và nó là một thể hiện của Illuminate\Database\Eloquent\Collection. Collection cung cấp một phương thức hữu ích để làm việc với các kết qủa trả về của Eloquent :man_gesturing_ok:
$flights = $flights->reject(function ($flight) {
    return $flight->cancelled;
});

Đương nhiên, bạn cũng có thể duyệt các phần tử của collection giống như với một mảng.

foreach ($flights as $flight) {
    echo $flight->name;
}

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí