Hướng dẫn laravel 6 from scratch - laravel 6 từ đầu

Đây là chuỗi bài viết theo phong thái dễ hiểu, đơn giản, cơ bản, phù hợp với những người bắt đầu với Laravel từ con số 0.

Trong bài viết này chúng ta sẽ quan tâm đến một số cách sử dụng eloquent trong laravel nhé. Xem lại khái niệm về eloquent tại đây.

Basic Eloquent

Phần này sẽ bao gồm các nội dung sau:

  • Các quan hệ (Relationship)
  • Sinh dữ liệu để test và triển khai quan hệ một nhiều.

Các quan hệ - Basic Eloquent Relationships

Trong cơ sở dữ liệu quan hệ, chúng ta đã rất quen thuộc với các mối quan hệ như một-một, một-nhiều, nhiều-nhiều. Cũng như các ngôn ngữ khác, Eloquent sẽ có các method để mô phỏng các quan hệ này với mục đích hạn chế chúng ta phải viết những câu SQL query.

Ví dụ trong thực tế như sau:

Một giảng viên đại học xuất bản các bài báo khoa học. Tức, một giảng viên sẽ có một hoặc nhiều bài báo.

Mô phỏng trong cơ sở dữ liệu quan hệ sẽ như sau:

Mối quan hệ giữa hai thực thể này là một-nhiều (một giảng viên có nhiều bài báo). Khi triển khai thực tế, sẽ có 2 bảng là users và articles. Để thiết lập mối quan hệ một nhiều thì ở bảng articles sẽ có thêm trường user_id (khóa ngoại liên kết tới bảng users).usersarticles. Để thiết lập mối quan hệ một nhiều thì ở bảng articles sẽ có thêm trường user_id (khóa ngoại liên kết tới bảng users).

Mô phỏng trong code của laravel với các method tương ứng.

...
class User extends Authenticatable
{
    ...
    public function articles()
    {
        # hasMany(): có nhiều
        return $this->hasMany(Article::class);
    }
}
...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}

Chúng ta thử cùng suy nghĩ thực tế như sau:

Với trường hợp thực tế như trên, có thể khi muốn có thông tin liên quan, ta sẽ hỏi:hỏi:

  • Giảng viên có những bài báo nào?
  • Giảng viên có tất cả bao nhiêu bài báo?
  • Giảng viên có bài báo nào tên là "Laravel" không?
  • ...

⇒ Đi từ giảng viên để hỏi-truy vấn dữ liệu về các bài báo.hỏi-truy vấn dữ liệu về các bài báo.

  • Bài báo này là của ai?
  • Bài báo có mã hiệu đính (id) là 1 là của ai?
  • ...

⇒ Đi từ giảng viên để hỏi-truy vấn dữ liệu về các bài báo.hỏi-truy vấn dữ liệu về giảng viên.

Bài báo này là của ai?

$user=App\User::find(1);
$user->articles;

Bài báo có mã hiệu đính (id) là 1 là của ai?Như vậy đã trả lời được câu hỏi "Giảng viên có những bài báo nào?"

⇒ Đi từ bài báo để hỏi-truy vấn dữ liệu về giảng viên.

Ta sẽ thực thi câu lệnh như sau tại

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
5:

Câu lệnh

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
6 sẽ gọi đến method được đặc tả ở
...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
7, thì hàm
...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
8 sẽ tiếp tục được triển khai. Method này sẽ tự thông dịch ra những câu truy vấn SQL như
...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
9 và trả về kết quả truy vấn. Như vậy đã trả lời được câu hỏi "Giảng viên có những bài báo nào?"

Ta thấy ở đây mọi thứ đều có liên kết và được truy vấn thông qua liên kết đó. Mọi thứ từ thực tế đến môi trường code đều trở nên logic, dễ hiểu theo hướng suy nghĩ của con người.

Hướng dẫn laravel 6 from scratch - laravel 6 từ đầu
Phần tiếp theo chúng ta sẽ thực hành những điều ở trên.

Sinh dữ liệu để test và triển khai quan hệ một nhiều.

Các quan hệ - Basic Eloquent Relationshipsusers-articles ta sẽ thêm trường user_id vào bảng articles, và thiết lập khóa ngoài cho nó link đến bản users. Chứng ta có thể sửa file migrate như sau.

...
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            # Thêm trường user_id
            $table->unsignedBigInteger('user_id');
            $table->string('title');
            $table->text('excerpt');
            $table->text('body');
            $table->timestamps();

            # Thêm khóa ngoài ở trường user_id link đến trường id của bảng users.
            # Tùy chọn onDelete('cascade') ở đây để đảm bảo khi xóa user, thì các article cũng được xóa đi (xóa giảng viên thì các bài báo của giảng viên đó cũng được xóa đi).
            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');
        });
    }
 ...

Trong cơ sở dữ liệu quan hệ, chúng ta đã rất quen thuộc với các mối quan hệ như một-một, một-nhiều, nhiều-nhiều. Cũng như các ngôn ngữ khác, Eloquent sẽ có các method để mô phỏng các quan hệ này với mục đích hạn chế chúng ta phải viết những câu SQL query.

Ví dụ trong thực tế như sau:

Một giảng viên đại học xuất bản các bài báo khoa học. Tức, một giảng viên sẽ có một hoặc nhiều bài báo.

Hướng dẫn laravel 6 from scratch - laravel 6 từ đầu

Mô phỏng trong cơ sở dữ liệu quan hệ sẽ như sau:



use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
});

Mối quan hệ giữa hai thực thể này là một-nhiều (một giảng viên có nhiều bài báo). Khi triển khai thực tế, sẽ có 2 bảng là users và articles. Để thiết lập mối quan hệ một nhiều thì ở bảng articles sẽ có thêm trường user_id (khóa ngoại liên kết tới bảng users).

Hướng dẫn laravel 6 from scratch - laravel 6 từ đầu

factory(App\User::class)->create();

Mô phỏng trong code của laravel với các method tương ứng.

=> App\User {#3147
     name: "Jean Koepp DDS",
     email: "",
     email_verified_at: "2020-09-16 03:54:11",
     updated_at: "2020-09-16 03:54:11",
     created_at: "2020-09-16 03:54:11",
     id: 11,
   }

Chúng ta thử cùng suy nghĩ thực tế như sau:

factory(App\User::class, 5)->create();

Với trường hợp thực tế như trên, có thể khi muốn có thông tin liên quan, ta sẽ hỏi:

php artisan make:factory ArticleFactory -m "App\Article"

Giảng viên có những bài báo nào?

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
0

Giảng viên có tất cả bao nhiêu bài báo?

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
1

Giảng viên có bài báo nào tên là "Laravel" không?

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
2

...

⇒ Đi từ giảng viên để hỏi-truy vấn dữ liệu về các bài báo.

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
3

Sau khi đã thiết lập các quan hệ

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
8 và
$user=App\User::find(1);
$user->articles;
3 như phần trước, thì giờ chúng ta có thể thực hiện các truy xuất như sau trong
$user=App\User::find(1);
$user->articles;
1

...
class Article extends Model
{
    ...
    public function user()
    {
        # belongsTo(): thuộc về
        return $this->belongsTo(User::class);
    }
}
4

Kiến thức đang dần nâng cao lên. Nếu có gì không hiểu, thì hãy comment nhé.

Phần này xin được tạm kết tại đây! Nguồn tham khảo: https://laracasts.com/series/laravel-6-from-scratch/