Laravel Thaiaddress Package
Tags: laravel, database, mirgation, package
Published: 2019-06-22 15:28:06

---
title: Laravel Thaiaddress Package
published: true
description: Laravel migration สำหรับ จังหวัด อำเภอ ตำบล รหัสไปรษณีย์ ละติจูด ลองจิจูด
tags: laravel, database, mirgation, package
cover_image: https://thepracticaldev.s3.amazonaws.com/i/y1gfsqks1hirynkddx3q.jpg
---


พอดีมีโอกาสได้ไปรู้จักกับ repo [ฐานข้อมูล จังหวัด อำเภอ ตำบล ละติจูด ลองจิจูด](https://github.com/aaronamm/thai-administrative-division-province-district-subdistrict-sql)
ใน GitHub เข้า เลยเอามาใช้กับโปรเจ็คทดลองที่กำลังสร้างด้วย laravel ครับ

ทั้งนี้ทั้งนั้น repo ของคุณ [Aaron Amm](https://github.com/aaronamm) มีประโยชน์มากๆ ขอขอบคุณไว้ ณ ที่นี้ด้วยครับ

เมื่อได้มีโอกาสใช้งานกับ laravel แล้วก็เลยคิดว่าน่าจะมีประโยชน์ในโปรเจ็คต่อไปในอนาคตด้วย
เลยเอามาทำเป็น laravel package เผื่อไว้ใช้งานในโปรเจ็ตต่อไป
ถ้าเพื่อนๆสนใจก็สามารถเอาไปติดตั้งใช้งานหรือเอาไปต่อยอดกันได้เลยครับ

## Repositories

- Github [uatthaphon/laravel-thai-address](https://github.com/uatthaphon/laravel-thai-address)
- Packagist [uatthaphon/laravel-thai-address](https://packagist.org/packages/uatthaphon/laravel-thai-address)

## laravel-thai-address แพคเกจ คืออะไร

แพคเกจ laravel-thai-address คือการนำเอา ฐานข้อมูล จังหวัด อำเภอ ตำบล ที่ได้กล่าวไปแล้วข้างต้น
มาสร้าง เป็น migration สำหรับ laravel framwork โดย จะแบ่งตัว migrations ออกเป็น 3 ไฟล์
เพื่อสร้างตารางในดาต้าเบสแยกกัน

จากนั้นก็ทำการ seeds ข้อมูล ที่อยู่ในรูปแบบของ csv ไฟล์ที่มีอยู่ในแพคเกจเข้าไปยังตารางแต่ละตารางให้ถูกต้อง
หลังจากที่เราได้ทำการ migrate ตารางใหม่เสร็จเป็นที่เรียบร้อย

### ติดตั้ง

เพิ่มแพคเกจเข้าไปยังโปรเจ็คของเรา

```bash
$ composer require uatthaphon/laravel-thai-address
```
ถ้าเราใช้ laravel เวอร์ชั่นที่ตำกว่า 5.5 เราต้องทำการเพิ่ม service provide เข้าไปที่ `config/app.php` ด้วยตนเอง

```php
<?php
'providers' => [
  ...

  Uatthaphon\ThaiAddress\ThaiAddressServiceProvider::class,
],
```

แต่สำหรับ laravel version 5.5 ขึ้นไปผมได้เพิ่ม [auto discoverable](https://laravel-news.com/package-auto-discovery) เข้าไปในตัวแพคเกจเรียบร้อยแล้วทำให้เราไม่ต้องทำการเพิ่มบรรทัดเข้าไปยัง `config/app.php`

จากนั้นทำการรันคำสั่ง verder publish สำหรับแท็ก 3 แท็ก

1. `$ php artisan vendor:publish --tag=migrations`
2. `$ php artisan vendor:publish --tag=csv`
3. `$ php artisan vendor:publish --tag=seeds`

หรือถ้าต้องการ publish แท็กทั้งหมดในคราวเดียวก็สามารถทำได้

```bash
$ php artisan vendor:publish
```

ขั้นตอนต่อไป เราจะมาทำการสร้างตารางหลังจากที่เราทำการ publish ทุกอย่างเป็นที่เรียบร้อยแล้ว

```bash
$ php artisan migrate
```

จากนั้นก็ทำการเพิ่มข้อมูลเข้าไปยังตารางของเราด้วย seeder โดยที่ seeder
จะนำเอาไฟล์ csv ที่ตอนนี้อยู่ในโปรเจ็คของเราเป็นที่เรียบร้อยแล้ว หลังจากเราทำการ publish มันเข้ามา
และเอาข้อมูลที่ได้ ไปเพิ่มเข้าไปยังตารางแต่ละตารางอย่างถูกต้อง

```bash
$ php artisan db:seed --class=ThailandAddressSeeder
```

### การใช้งาน

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

### ตัวช่วย

ในแพคเกจของเรามี Models relationship ติดมาให้ใช้ด้วยครับ

~~ถ้าหากใครต้องการใช้งานตัว Models ไฟล์ที่ผูก relationship ไว้ก็สามารถเพิ่ม psr-4 เข้าไปใน
`composer.json` เพื่อเรียกใช้งานในโปรเจ็คได้เลยครับ~~
***ตอนนี้ได้ทำการอัพเดตตัว package แล้วจึงไม่จำเป็นต้องเพิ่ม psr-4 ใน composer.json
ของตัวโปรเจ็คที่เรียกใช้งานครับ ดังนั้นเราสามารถเรียกใช้ตรงๆได้เลยตามตัวอย่างด้านล่างครับ***

จากนั้นก็เอาไปใช้ได้เลยครับ

```php

<?php

use Uatthaphon\ThaiAddress\Models\ThailandProvince;
use Uatthaphon\ThaiAddress\Models\ThailandDistrict;
use Uatthaphon\ThaiAddress\Models\ThailandSubdistrict;

...

/**
 * Available Relationships
 */

// list all districts under the province
app(ThailandProvince::class)->find(1)->districts()->get();

// get province of the district
app(ThailandDistrict::class)->find(1)->province;
// list all sub districtes under the district
app(ThailandDistrict::class)->find(1)->subdistricts()->get();

// get district of the subdistrict
app(ThailandSubdistrict::class)->find(1)->district;
// get province of the subdistrict
app(ThailandSubdistrict::class)->find(1)->province;
```

ถ้าใครมีข้อสงสัยก็สามารถคอมเม้นทิ้งไว้ได้นะครับ
หรือถ้ามี bug หรือ issue อะไรก็โพสไว้ที่ github ได้เลยครับ