สร้างโดยใช้ make:model
Artisan command:
1 |
php artisan make:model User |
ถ้าอยากให้สร้าง database migration (ดูเพิ่มเติม) ให้ด้วย ให้เพิ่ม Option --migration
หรือ -m
option:
1 2 3 |
php artisan make:model User --migration php artisan make:model User -m |
จากนั้นเราจะได้ไฟล์ App/User.php
ในไฟล์ Model ของเราโค๊ดก็จะประมาณนี้
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { // } |
โดยปกติหาก Model เราชื่อว่า Flight
laravel ก็จะใช้ Model นี้ในดึงข้อมูลและจัดเก็บข้อมูลจากตารางที่ชื่อว่า flights
แต่ถ้าเราอยากจะตั้งชื่อเป็นอย่างอื่นก็ให้ใส่ตัวแปล protected $table = ‘ชื่อตารางที่ต้องการ’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The table associated with the model. * * @var string */ protected $table = 'my_tablename'; } |
โดยปกติ laravel จะกำหนดว่า column ชื่อว่า id
เป็น primary key แต่ถ้าอยากกำหนดเป็นอย่างอื่นก็ให้กำหนดค่าในตัวแปล $primaryKey
โดยปกติ Primary Key จะเป็น incrementing integer value (เป็นตัวเลขและรันค่า id อัตโนมัติ) ถ้าหากอยากกำหนดเป็น non-incrementing or a non-numeric ก็ให้กำหนดในตัวแปล public $incrementing
กำหนดเป็นfalse
.
โดยค่าเริ่มต้น laravel กำหนดให้มีคอลัมน์ created_at และ updated_at อยู่ในตาราง แต่ถ้าหากไม่ต้องการใช้ก็ให้ใส่ตัวแปล $timestamps
เป็น false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * Indicates if the model should be timestamped. * * @var bool */ public $timestamps = false; } |
หากต้องการเปลี่ยนชื่อของ columns ก็ให้กำหนดในตัวแปลค่าคงที่ CREATED_AT
และUPDATED_AT
1 2 3 4 5 6 7 |
<?php class Flight extends Model { const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update'; } |
โดยค่าเริ่มต้นระบบจะกำหนด database connection ตาม configured ของ application (ที่อยู่ในไฟล์ .env หรือ config/app.php) แต่ถ้าอยากจะกำหนด database connection อย่างอื่นเฉพาะ Model นี้ ก็ให้กำหนดใน $connection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The connection name for the model. * * @var string */ protected $connection = 'connection-name'; } |
สามารถใช้ query builder ในการดึงข้อมูลใน Eloquent models ได้ สามารถเขียนสคริปดึงข้อมูลได้ทั้งใน routes หรือใน controller
1 2 3 4 5 6 7 8 9 |
<?php use App\Flight; $flights = App\Flight::all(); foreach ($flights as $flight) { echo $flight->name; } |
ตัวอย่างเพิ่มเติม
1 2 3 4 |
$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get(); |
ในการดึงข้อมูลออกมาซึ่งอาจจะใช้ all
และget
ข้อมูลที่ได้จะอยู่ในรูปแบบของ Collection
สามารถใช้ a variety of helpful methods จัดการข้อมูลที่ได้จาก Eloquent models นั้นได้
1 2 3 |
$flights = $flights->reject(function ($flight) { return $flight->cancelled; }); |
ตัวอย่างเพิ่มเติม
1 2 3 |
foreach ($flights as $flight) { echo $flight->name; } |
คือการแบ่ง Query ออกเป็นช่วงๆ จะช่วยประหยัดหน่วยความจำ(memory) เมื่อทำงานกับชุดผลลัพธ์ขนาดใหญ่ ตัวอย่างข้างล่างคือ ระบบจะ query ครั้งล่ะ 200 rows ไปจนกว่าจะสิ้นสุด
1 2 3 4 5 |
Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } }); |
นอกจากการดึงข้อมูลทั้งหมดของตารางที่ระบุ แล้วคุณยังอาจเรียกดูเรคคอร์ดเดียว โดยใช้ find
หรือ first
ก็ได้
1 2 3 4 5 |
// Retrieve a model by its primary key... $flight = App\Flight::find(1); // Retrieve the first model matching the query constraints... $flight = App\Flight::where('active', 1)->first(); |
find
สามารถเรียกดูข้อมูลจาก array ของ primary key ได้
1 |
$flights = App\Flight::find([1, 2, 3]); |
ใช้ findOrFail
และfirstOrFail
หากหาข้อมูลไม่เจอระบบจะแจ้ง หน้า error 404
อัตโนมัติ
1 2 3 |
$model = App\Flight::findOrFail(1); $model = App\Flight::where('legs', '>', 100)->firstOrFail(); |
หากหาข้อมูลไม่เจอระบบจะแจ้ง หน้า error 404
อัตโนมัติ
1 2 3 |
Route::get('/api/flights/{id}', function ($id) { return App\Flight::findOrFail($id); }); |
สามารถใช้ count
, sum
, max
และ aggregate methods ได้ตามตัวอย่างด้านล่าง
1 2 3 |
$count = App\Flight::where('active', 1)->count(); $max = App\Flight::where('active', 1)->max('price'); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Http\Controllers; use App\Flight; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class FlightController extends Controller { /** * Create a new flight instance. * * @param Request $request * @return Response */ public function store(Request $request) { // Validate the request... $flight = new Flight; $flight->name = $request->name; $flight->save(); } } |
โดยกำหนดค่าให้กับ name
โดยค่าส่งมาจากพารามิเตอร์ HTTP request to (ที่อาจจะถูกส่งมาจากฟอร์ม) column created_at
และupdated_at
จะถูกอัพเดทให้อัตโนมัติ
1 2 3 4 5 |
$flight = App\Flight::find(1); $flight->name = 'New Flight Name'; $flight->save(); |
column updated_at
จะถูกอัพเดทให้อัตโนมัติ
1 2 3 |
App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]); |
ระบบจะทำการอัพเดท column delayed ให้เท่ากับ 1 ทุก Flight ที่ Active=1 และ destination=’San Diego’
เราสามารถสร้างข้อมูลได้ในบรรทัดเดียวโดยใช้ create
method แต่ก่อนที่จะใช้งาน ต้องกำหนด attribute fillable
หรือguarded
ใน Model ของเราก่อน
fillable
คือกำหนดชื่อของ column ที่อนุญาติให้เข้าถึง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = ['name']; } |
เราสามารถที่จะสร้างข้อมูลให้กับ column name ได้แล้ว
1 |
$flight = App\Flight::create(['name' => 'Flight 10']); |
guarded
คือกำหนดชื่อของ column ที่ไม่อนุญาติให้เข้าถึง นอกเหนือจากนั้นเข้าถึงได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model { /** * The attributes that aren't mass assignable. * * @var array */ protected $guarded = ['price']; } |
หากกำหนด $guarded
เป็นค่าว่าง ก็แสดงว่าทุก column สามารถเข้าถึงได้
1 2 3 4 5 6 |
/** * The attributes that aren't mass assignable. * * @var array */ protected $guarded = []; |
ตัวอย่างการใช้งาน โดยรับค่าจากฟอร์มด้วย HTTP request (ซึ่งชื่อ input ในฟอร์มต้องตรงกับ column ในตาราง)
1 2 3 4 5 6 7 8 9 10 |
/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(StoreRentPost $request) { Flight::create($request->all()); } |
firstOrCreate
/ firstOrNew
firstOrCreate จะค้นหาข้อมูลโดยใช้คอลัมน์ / ค่าที่ระบุ ถ้าไม่พบจะทำการสร้างข้อมูลขึ้นมาด้วยแอตทริบิวต์ที่ระบุ
firstOrNew จะค้นหาข้อมูลโดยใช้คอลัมน์ / ค่าที่ระบุ ถ้าไม่พบจะทำ new model instance ขึ้นมา แต่ยังไม่ได้สร้างข้อมูลใหม่ เราต้องเรียกใช้ save()
ด้วยตัวเองเพื่อให้ระบบทำการสร้างข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Retrieve flight by name, or create it if it doesn't exist... $flight = App\Flight::firstOrCreate(['name' => 'Flight 10']); // Retrieve flight by name, or create it with the name and delayed attributes... $flight = App\Flight::firstOrCreate( ['name' => 'Flight 10'], ['delayed' => 1] ); // Retrieve by name, or instantiate... $flight = App\Flight::firstOrNew(['name' => 'Flight 10']); // Retrieve by name, or instantiate with the name and delayed attributes... $flight = App\Flight::firstOrNew( ['name' => 'Flight 10'], ['delayed' => 1] ); |
updateOrCreate
ระบบจะทำการอัพเดทข้อมูลหากข้อมูลมีอยู่ แต่หากข้อมูลไม่มี ระบจะสร้างขึ้นมาใหม่ (ไม่ต้องเรียกใช้save()
)
1 2 3 4 5 6 |
// If there's a flight from Oakland to San Diego, set the price to $99. // If no matching model exists, create one. $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] ); |
ระบบจะทำการลบข้อมูล Flight ที่มี id=1
1 2 3 |
$flight = App\Flight::find(1); $flight->delete(); |
ในตัวอย่างด้านบนเราจะทำการดึงข้อมูลที่จะลบขึ้นมาก่อนค่อยลบ แต่หากเราจะระบุ primary key ลงไปเลยโดยไม่ต้องดึงข้อมูลก็ทำได้ตามด้านล่าง
1 2 3 4 5 |
App\Flight::destroy(1); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(1, 2, 3); |
ตัวอย่างด้านล่างคือลบทุก Flight ที่มี column active=0
1 |
$deletedRows = App\Flight::where('active', 0)->delete(); |
คือการลบข้อมูลโดยที่ไม่ได้ลบออกจากฐานข้อมูลจริงๆ แต่จะไปเพิ่มวันเวลาที่ลบใว้ใน column deleted_at
แทน และระบบจะไม่ดึงข้อมูลที่ deleted_at
ไม่เท่ากับ null มาแสดง วิธีใช้งาน Soft Deleting ใน Model ให้กำหนดค่าตามด้านล่าง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Flight extends Model { use SoftDeletes; /** * The attributes that should be mutated to dates. * * @var array */ protected $dates = ['deleted_at']; } |
โดยในตารางต้องมี column deleted_at
โดยอาจจะใช้ schema builder ในขั้นตอนการ migrations-และ-seeding สร้างให้ก็ได้ตามโค๊ดด้านล่าง
1 2 3 |
Schema::table('flights', function ($table) { $table->softDeletes(); }); |
หากต้องการตรวจสอบว่า Model นี้มีการตั้งค่า SoftDeletes ใว้ไหม
1 2 3 |
if ($flight->trashed()) { // } |
ดึงข้อมูลโดยรวมข้อมูลที่ถูกลบแบบ SoftDeletes ด้วย
1 2 3 |
$flights = App\Flight::withTrashed() ->where('account_id', 1) ->get(); |
สามารถใช้กับ Model แบบ Relation ได้
1 |
$flight->history()->withTrashed()->get(); |
ดึงมาเฉพาะข้อมูลที่ถูกลบแบบ SoftDeletes
1 2 3 |
$flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get(); |
หากต้องการ “ยกเลิกการลบ” ในการกู้คืนให้ใช้ restore
1 |
$flight->restore(); |
ตัวอย่างการยกเลิกการลบ หลายๆเรคคอร์ด
1 2 3 |
App\Flight::withTrashed() ->where('airline_id', 1) ->restore(); |
สามารถใช้ได้กับ Model Relation ได้
1 |
$flight->history()->restore(); |
ลบข้อมูลที่ลบแบบ SoftDeletes ออกจากฐานข้อมูลจริงๆ
1 2 3 4 5 |
// Force deleting a single model instance... $flight->forceDelete(); // Force deleting all related models... $flight->history()->forceDelete(); |
คือการสร้างฟังค์ชันที่ใช้สำหรับ Query ในแบบเฉพาะที่เราต้องการ
คือสร้างฟังค์ชันการ Query ที่ทุกๆ Model สามารถเรียกใช้ได้
สร้าง Class ชื่อ AgeScope ให้เรา implement ใน method ที่ชื่อ apply
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /** * Apply the scope to a given Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { $builder->where('age', '>', 200); } } |
ใน global scope หากต้องการเขียน select column ใน query แนะนำให้ใช้ addSelect
(ดูเพิ่มเติม) เพื่อป้องกันการ select ซ้ำซ้อนกัน เวลา Model ต่างๆเรียกใช้งาน
วิธีการใช้งาน Global Scopes ให้ทำการ Override boot
methodc และใช้งาน addGlobalScope
method:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App; use App\Scopes\AgeScope; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The "booting" method of the model. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope(new AgeScope); } } |
หากเราเรียก query User::all()
คำสั่ง SQL ก็จะถูกสร้างตามด้านล่าง
1 |
select * from `users` where `age` > 200 |
สามารถกำหนดเงื่อนไขต่างได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class User extends Model { /** * The "booting" method of the model. * * @return void */ protected static function boot() { parent::boot(); static::addGlobalScope('age', function (Builder $builder) { $builder->where('age', '>', 200); }); } } |
ไม่ใช้ Global Scopes ใน Query ที่ต้องการ
1 2 3 4 5 6 7 8 9 |
User::withoutGlobalScope(AgeScope::class)->get(); // Remove all of the global scopes... User::withoutGlobalScopes()->get(); // Remove some of the global scopes... User::withoutGlobalScopes([ FirstScope::class, SecondScope::class ])->get(); |
สร้างฟังค์ชันการ Query ที่ได้ใช้บ่อยๆใว้ใน Model โดยสร้าง Method ที่ขึ้นต้นด้วย scope
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Scope a query to only include popular users. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopePopular($query) { return $query->where('votes', '>', 100); } /** * Scope a query to only include active users. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('active', 1); } } |
การใช้งาน
1 |
$users = App\User::popular()->active()->orderBy('created_at')->get(); |
ได้คำสั่ง SQL เป็น
1 |
select * from `users` where `votes` > 100 and `active`=1 order by `created_at` |
สามารถส่งค่าพารามิเตอร์เข้าไปได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Scope a query to only include users of a given type. * * @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database\Eloquent\Builder */ public function scopeOfType($query, $type) { return $query->where('type', $type); } } |
ตัวอย่างการใช้งาน
1 |
$users = App\User::ofType('admin')->get(); |
ที่มา : https://laravel.com/docs/5.4/eloquent
ป้ายกำกับ:laravel