Menu

Showing posts with label eloquent. Show all posts
Showing posts with label eloquent. Show all posts

Tuesday, February 25, 2020

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model by Using SSH Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model ที่เราเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล โดยใช้การเข้ารหัสและถอดรหัสของ Laravel ซึ่งใช้ APP_KEY ใน .env เป็น key ทำให้คนที่เข้าถึง application สามารถถอดรหัสข้อมูลได้

เพื่อเพิ่มความปลอดภัยขึ้นไปอีกขั้น เราจะเปลี่ยนจากการใช้ APP_KEY ใน .env เป็น SSH Keys ซึ่งแยกเป็น Public key และ Private key แทน โดยเราจะได้เพียง Public key มาใช้ในการเข้ารหัส แต่คนมีสิทธิ์ดูข้อมูลเท่านั้นที่จะมี Private key เพื่อใช้ถอดรหัสข้อมูล

Thursday, November 28, 2019

[Laravel - Model] การตั้งค่า Attribute ของ Model ให้เป็น Lower Case
[Laravel - Model] How to Set Model Attribute to Lower Case

บางครั้งเราจำเป็นต้องทำระบบที่เชื่อมต่อกับฐานข้อมูลเดิมที่มีอยู่แล้ว และฐานข้อมูลเหล่านั้นอาจจะมีชื่อ column เป็นตัวพิมพ์ใหญ่ทั้งหมด เวลาใช้งานแต่ละ column จะต้องพิมพ์ชื่อเป็นตัวพิมพ์ใหญ่ ทำให้ยากต่อการเขียนโค้ด

สำหรับ Laravel แล้ว เราสามารถตั้งค่าเพื่อให้เปลี่ยนชื่อ column พวกนี้เป็นตัวพิมพ์เล็ก เมื่อเราเรียกใช้งานได้

วิธีการตั้งค่า

  1. เข้าไปที่ config/database.php
  2. เพิ่มโค้ดข้างล่างในส่วนของ connections ที่ต้องการ
  3. 'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        PDO::ATTR_CASE => PDO::CASE_LOWER,
    ]) : [
        PDO::ATTR_CASE => PDO::CASE_LOWER,
    ],
    

Wednesday, November 27, 2019

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model

ในบางกรณี เราต้องการรักษาความลับของข้อมูล โดยอนุญาตให้เฉพาะผู้ที่เกี่ยวข้องเท่านั้นที่สามารถดูและแก้ไขได้ ระบบส่วนใหญ่จึงจำกัดสิทธิ์การใช้งานของแต่ละผู้ใช้งานภายใน application

อย่างไรก็ตาม ระบบดังกล่าวยังคงเก็บข้อมูลจริงลงฐานข้อมูลโดยไม่มีการเข้ารหัสใดๆ ทำให้ Database Admin ยังสามารถเข้าดูข้อมูลและแก้ไขได้

การเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล จึงเป็นการเพิ่มความปลอดภัยของข้อมูลอีกขั้นนึง

สำหรับ Laravel Model ที่มี function กลางสำหรับการดึงค่าข้อมูลและเก็บข้อมูลของ Fields ต่างๆ ทำให้การเข้ารหัสและถอดรหัสนั้นทำได้ง่ายขึ้นมาก เราเพียงเขียน Trait แล้วนำไปใส่ใน Model พร้อมกับกำหนด Fields ที่เราต้องการเข้ารหัสเท่านั้น

Friday, November 22, 2019

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Sluggable
[Laravel - Package] How to Install and Config Laravel Sluggable

Eloquent-Sluggable เป็น package เสริมสำหรับสร้าง Slug ภายใน Laravel Model โดยจะสร้าง Slug ใส่ฟิลด์ที่ระบุให้โดยอัตโนมัติ เมื่อมีการบันทึกข้อมูล

วิธีการติดตั้ง

  1. สั่งติดตั้ง Eloquent-Sluggable package
  2. composer require cviebrock/eloquent-sluggable
  3. สร้างไฟล์ config ของ package ใน project
  4. php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
    

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Activity Log
[Laravel - Package] How to Install and Config Laravel Activity Log

laravel-activitylog เป็น package สำหรับใช้จัดเก็บ log การใช้งานของ user ยิ่งไปกว่านั้น package นี้สามารถเก็บ log จาก model event ได้โดยอัตโนมัติ

วิธีการติดตั้ง

  1. สั่งติดตั้ง laravel-activitylog package
  2. composer require spatie/laravel-activitylog
  3. สร้างไฟล์ migration ของ package ใน project
  4. php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="migrations"
    
  5. รัน migrate เพื่อสร้างตารางในฐานข้อมูล
  6. php artisan migrate
    
  7. สร้างไฟล์ config ของ package ใน project
  8. php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="config"
    

Thursday, November 21, 2019

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Permission
[Laravel - Package] How to Install and Config Laravel Permission

laravel-permission เป็น package สำหรับจัดการ roles และ permissions ของ user ใน database

วิธีการติดตั้ง

  1. สั่งติดตั้ง laravel-permission package
  2. composer require spatie/laravel-permission
  3. สร้างไฟล์ migration ของ package ใน project
  4. php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
    
  5. รัน migrate เพื่อสร้างตารางในฐานข้อมูล
  6. php artisan migrate
    
  7. สร้างไฟล์ config ของ package ใน project
  8. php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
    

Thursday, October 3, 2019

[Laravel - Model] วิธีการ Query Pivot Table ของ Laravel Model
[Laravel - Model] How to Query Pivot Table of Laravel Model

การ select ข้อมูลโดยเอาข้อมูลจาก Pivot Table ด้วย
$this->devices()->withPivot()->get();
การอ้างอิงถึง column ใน Pivot Table จะใช้ pivot_ นำหน้าชื่อ column ที่ต้องการ ตามตัวอย่างข้างล่าง
$user->devices()->orderBy('pivot_updated_at', 'desc')->paginate();
การ update ข้อมูลใน Pivot Table โดยอ้างอิงจาก relation
$this->devices()->updateExistingPivot($deviceId, [
    'status' => 'active',
    'updated_at' => Carbon::now(),
]);
การรัน statement ที่ Pivot Table โดยตรง ซึ่งต้องใส่เงื่อนไขใน where เอง 
$this->devices()->newPivotStatement()
    ->where('user_id', $userId)
    ->whereIn('device_id', $deviceIds)
    ->update(['status' => 'inactive']);
หมายเหตุ การรัน statement ที่ Pivot Table โดยตรง สามารถเปลี่ยนจาก update เป็น delete เพื่อลบข้อมูล หรือเป็น get เพื่อดึงข้อมูลมาแสดง

Monday, September 30, 2019

[Laravel - Model] วิธีเปลี่ยน User Model สำหรับการ Authentication เมื่อสร้าง User Model เอง
[Laravel - Model] How to Change User Model for Authentication when Create User Model Manually

หลังจากที่เราสร้าง User model ใหม่หรือมีการย้าย path ของ User model เดิมไปไว้ยังที่ใหม่ เราต้องแก้ไขค่าของ model ในไฟล์ config/auth.php ด้วย

เมื่อเปิดไฟล์ config/auth.php เราจะเจอบรรทัดที่กำหนดค่าเริ่มต้นของ model เป็น App\User::class ตามรูปข้างล่าง ให้ทำการแก้ไขบรรทัดดังกล่าวเป็น Class ของ User ที่ต้องการ


เพียงเท่านี้ User model ของเราก็จะถูกเรียกใช้โดย Laravel โดยอัตโนมัติ

Tuesday, September 17, 2019

[Laravel - Model] สรุป syntax ต่างๆของ where หรือ orWhere ที่ใช้ในการ Query
[Laravel - Model] Syntax of where or orWhere that is used in Query

สมมติว่า User เป็น model ของ Laravel ซึ่งมีตารางที่คู่กัน คือ users

หากเราต้องการเรียกดูข้อมูล user ที่มี name เป็น 'test'

สำหรับ SQL ก็คือ
select * from users where name = 'test';
สำหรับ Laravel สามารถใช้ syntax ได้ตามข้างล่างนี้
  1. User::where('name', 'test')->get(); 
  2. User::where('name', '=', 'test')->get();
  3. User::where(['name' => 'test'])->get();
  4. User::where([['name', '=', 'test']])->get();
  5. User::where(function($q){ 
        $q->where('name', 'test');
    })->get();
ทั้ง 5 รูปแบบข้างต้น จะถูกแปลงเป็น SQL ตามข้างต้นในการ Query ข้อมูลจาก database

หมายเหตุ รูปแบบที่ 5 เป็นการส่ง parameter แบบ Closure สำหรับการ Query ที่ซับซ้อน ซึ่งภายใน Closure นี้สามารถใช้ where ได้ตาม syntax ข้างบนเช่นกัน

Monday, August 5, 2019

[Laravel - Model] ข้อควรระวังของการใช้ฟังก์ชั่น where และ orWhere ของ Laravel Model
[Laravel - Model] Warning: Using where and orWhere functions of Laravel Model

สมมติว่า
  • OrganizationChildren เป็น Laravel model ที่ผูกกับตาราง organization_children ในฐานข้อมูล
  • OrganizationChildren ประกอบด้วยฟิลด์ parent_organization_id และ child_organization_id 
  • $org1->id และ $org2->id เป็นค่า id ของ Organization โดยมีค่าเป็น 1 และ 2 ตามลำดับ

ถ้าเราต้องการ query ข้อมูล โดยใช้ SQL ดังนี้
select * 
from `organization_children` 
where (`parent_organization_id` = 1 and `child_organization_id` = 2) or 
(`parent_organization_id` = 2 and `child_organization_id` = 1)

Tuesday, January 15, 2019

[Laravel - Model] การแปลง Query Builder ไปเป็น SQL Query String
[Laravel - Model] How to Convert Query Builder to SQL Query String

สาเหตุที่ต้องแปลง Query Builder ไปเป็น SQL Query String ก็มีหลายสาเหตุด้วยกัน เช่น การ debug query ที่เกิด error ขึ้น เป็นต้น ซึ่งสามารถใช้โค้ดได้ตามด้านล่างนี้
$sql= str_replace(array('?'), array('\'%s\''), $query->toSql());
$sql = vsprintf($sql, $query->getBindings());
เมื่อ $query คือ Query Builder และ $sql คือ Query String ที่ได้จากการแปลง