ฐานข้อมูลโมเดล Model การใช้งาน (สไตล์ Laravel)
โมเดล webman อิงจาก Eloquent ORM ซึ่งแต่ละตารางในฐานข้อมูลจะมี "โมเดล" ที่เกี่ยวข้องเพื่อสื่อสารกับตารางนั้น คุณสามารถใช้โมเดลเพื่อดึงข้อมูลจากตารางข้อมูลและแทรกบันทึกใหม่เข้าสู่ตารางข้อมูลได้
ก่อนเริ่มโปรดตรวจสอบว่าได้ตั้งค่าการเชื่อมต่อฐานข้อมูลใน config/database.php
เรียบร้อยแล้ว
หมายเหตุ: Eloquent ORM ต้องการให้มีการนำเข้า
composer require "illuminate/events"
เพิ่มเติมเพื่อสนับสนุนโมเดลออเบเซอเวอร์ ตัวอย่าง
ตัวอย่างโมเดลฐานข้อมูล
<?php
namespace app\model;
use support\Model;
class User extends Model
{
/**
* ชื่อของตารางที่เชื่อมโยงกับโมเดล
*
* @var string
*/
protected $table = 'user';
/**
* กำหนดค่า primary key ใหม่ ค่าเริ่มต้นคือ id
*
* @var string
*/
protected $primaryKey = 'uid';
/**
* ระบุว่าต้องการดูแล timestamp อัตโนมัติหรือไม่
*
* @var bool
*/
public $timestamps = false;
}
ชื่อของตาราง
คุณสามารถกำหนดตารางข้อมูลแบบกำหนดเองโดยการกำหนดคุณสมบัติ table ในโมเดล:
class User extends Model
{
/**
* ชื่อของตารางที่เชื่อมโยงกับโมเดล
*
* @var string
*/
protected $table = 'user';
}
Primary Key
Eloquent จะสมมติว่าแต่ละตารางในฐานข้อมูลมีคอลัมน์ primary key ที่ชื่อว่า id คุณสามารถกำหนดคุณสมบัติ $primaryKey ที่ถูกปกป้องเพื่อเขียนทับข้อกำหนดนี้
class User extends Model
{
/**
* กำหนดค่า primary key ใหม่ ค่าเริ่มต้นคือ id
*
* @var string
*/
protected $primaryKey = 'uid';
}
Eloquent นิยมให้ primary key เป็นค่าเต็มที่มีการเพิ่มขึ้น ซึ่งหมายความว่าโดยค่าเริ่มต้น primary key จะถูกแปลงเป็นประเภท int หากคุณต้องการใช้ primary key ที่ไม่เพิ่มขึ้นหรือนอกเหนือจากตัวเลข คุณต้องตั้งค่าคุณสมบัติสาธารณะ $incrementing เป็น false
class User extends Model
{
/**
* ระบุว่า primary key ของโมเดลเพิ่มขึ้นหรือไม่
*
* @var bool
*/
public $incrementing = false;
}
หาก primary key ของคุณไม่ใช่จำนวนเต็ม คุณต้องตั้งค่าคุณสมบัติ $keyType ที่ถูกปกป้องในโมเดลเป็น string:
class User extends Model
{
/**
* "ประเภท" ของ ID ที่เพิ่มขึ้นอัตโนมัติ
*
* @var string
*/
protected $keyType = 'string';
}
Timestamp
โดยค่าเริ่มต้น Eloquent คาดหวังว่าคุณจะมีคอลัมน์ created_at และ updated_at ในตารางข้อมูล หากคุณไม่ต้องการให้ Eloquent ดูแลทั้งสองคอลัมน์นี้โดยอัตโนมัติ โปรดตั้งค่าคุณสมบัติ $timestamps ในโมเดลเป็น false:
class User extends Model
{
/**
* ระบุว่าต้องการดูแล timestamp อัตโนมัติหรือไม่
*
* @var bool
*/
public $timestamps = false;
}
หากคุณต้องการกำหนดรูปแบบของ timestamp ให้กำหนดคุณสมบัติ $dateFormat ในโมเดลของคุณ คุณสมบัตินี้จะกำหนดวิธีการจัดเก็บวันในฐานข้อมูลรวมถึงรูปแบบที่โมเดลจะถูกจัดรูปแบบเป็นอาร์เรย์หรือ JSON:
class User extends Model
{
/**
* รูปแบบการจัดเก็บ timestamp
*
* @var string
*/
protected $dateFormat = 'U';
}
หากคุณต้องการกำหนดชื่อฟิลด์ที่จัดเก็บ timestamp ให้กำหนดค่าให้กับค่าคงที่ CREATED_AT และ UPDATED_AT ในโมเดล:
class User extends Model
{
const CREATED_AT = 'creation_date';
const UPDATED_AT = 'last_update';
}
การเชื่อมต่อฐานข้อมูล
ตามค่าเริ่มต้น โมเดล Eloquent จะใช้การเชื่อมต่อฐานข้อมูลเริ่มต้นที่กำหนดในแอปพลิเคชันของคุณ หากคุณต้องการระบุการเชื่อมต่อที่แตกต่างกันสำหรับโมเดลให้ตั้งค่าคุณสมบัติ $connection:
class User extends Model
{
/**
* ชื่อการเชื่อมต่อของโมเดล
*
* @var string
*/
protected $connection = 'connection-name';
}
ค่าพื้นฐานของคุณสมบัติ
หากคุณต้องการกำหนดค่าพื้นฐานสำหรับคุณสมบัติบางอย่างของโมเดล สามารถกำหนดคุณสมบัติ $attributes ในโมเดลได้:
class User extends Model
{
/**
* ค่าพื้นฐานของโมเดล
*
* @var array
*/
protected $attributes = [
'delayed' => false,
];
}
การเรียกค้นโมเดล
หลังจากสร้างโมเดลและตารางฐานข้อมูลที่เกี่ยวข้องแล้ว คุณสามารถเรียกค้นข้อมูลจากฐานข้อมูลได้ โดยการนึกถึงแต่ละโมเดล Eloquent เป็นเหมือนตัวสร้างคำสั่งค้นหาที่มีประสิทธิภาพ คุณสามารถใช้งานมันเพื่อค้นหาข้อมูลที่เกี่ยวข้องกับตารางได้รวดเร็วยิ่งขึ้น ตัวอย่างเช่น:
$users = app\model\User::all();
foreach ($users as $user) {
echo $user->name;
}
คำแนะนำ: เนื่องจากโมเดล Eloquent ก็เป็นตัวสร้างคำสั่งค้นหาเช่นกัน คุณควรอ่าน ตัวสร้างคำสั่งค้นหา เพื่อดูวิธีการทั้งหมดที่มีให้ใช้งาน คุณสามารถใช้วิธีการเหล่านี้ในการค้นหาข้อมูล Eloquent ได้
ข้อจำกัดเพิ่มเติม
วิธี all ของ Eloquent จะส่งคืนผลลัพธ์ทั้งหมดในโมเดล เนื่องจากแต่ละโมเดล Eloquent ทำหน้าที่เป็นตัวสร้างคำสั่งค้นหา คุณจึงสามารถเพิ่มเงื่อนไขการค้นหาและใช้วิธี get เพื่อดึงผลลัพธ์การค้นหา:
$users = app\model\User::where('name', 'like', '%tom')
->orderBy('uid', 'desc')
->limit(10)
->get();
โหลดโมเดลใหม่
คุณสามารถใช้ fresh และ refresh วิธีในการโหลดโมเดลใหม่ fresh จะดึงโมเดลกลับมาทั้งหมดจากฐานข้อมูล โมเดลที่มีอยู่จะไม่ถูกเปลี่ยนแปลง:
$user = app\model\User::where('name', 'tom')->first();
$fresh_user = $user->fresh();
refresh วิธีจะใส่ข้อมูลใหม่จากฐานข้อมูลเข้าไปในโมเดลที่มีอยู่ นอกจากนี้ความสัมพันธ์ที่ได้โหลดไว้ก่อนหน้านี้จะถูกโหลดใหม่:
$user = app\model\User::where('name', 'tom')->first();
$user->name = 'jerry';
$user = $user->fresh();
$user->name; // "tom"
ชุดข้อมูล
วิธี all และ get ของ Eloquent สามารถค้นหาได้หลายผลลัพธ์และส่งคืนอินสแตนซ์ Illuminate\Database\Eloquent\Collection
คลาส Collection
จะมีฟังก์ชันช่วยมากมายในการจัดการผลลัพธ์ของ Eloquent:
$users = $users->reject(function ($user) {
return $user->disabled;
});
การใช้ Cursor
วิธี cursor ช่วยให้คุณสามารถวนผ่านฐานข้อมูลได้โดยใช้ cursor มันจะทำการสอบถามเพียงครั้งเดียว ในการจัดการข้อมูลขนาดใหญ่ วิธี cursor จะสามารถลดการใช้หน่วยความจำได้มาก:
foreach (app\model\User::where('sex', 1)->cursor() as $user) {
//
}
cursor จะส่งคืนอินสแตนซ์ Illuminate\Support\LazyCollection
Lazy collections ช่วยให้คุณสามารถใช้วิธีการเก็บข้อมูลส่วนใหญ่จาก Laravel collection อย่างไรก็ตามมันจะโหลดโมเดลหนึ่งตัวเข้าไปในหน่วยความจำในแต่ละครั้ง:
$users = app\model\User::cursor()->filter(function ($user) {
return $user->id > 500;
});
foreach ($users as $user) {
echo $user->id;
}
Subquery Selects
Eloquent มีการสนับสนุน subquery ขั้นสูง ซึ่งคุณสามารถใช้คำสั่งเดียวเพื่อดึงข้อมูลจากตารางที่เกี่ยวข้อง ตัวอย่างเช่น สมมติว่าเรามีตารางปลายทาง destinations และตารางเที่ยวบินที่ไปยังปลายทางนั้น flights ตาราง flights มีฟิลด์ arrival_at ซึ่งเป็นเวลาที่เที่ยวบินถึงปลายทาง
ด้วยฟังก์ชัน subquery ที่ให้บริการโดยใช้วิธี select และ addSelect เราสามารถใช้คำสั่งเดียวเพื่อค้นหาเที่ยวบินสุดท้ายที่มาถึงแต่ละจุดหมายปลายทาง destinations พร้อมชื่อ:
use app\model\Destination;
use app\model\Flight;
return Destination::addSelect(['last_flight' => Flight::select('name')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
])->get();
จัดเรียงตาม Subquery
นอกจากนี้ ฟังก์ชัน orderBy ของตัวสร้างคำสั่งค้นหาก็รองรับ subquery ซึ่งเราสามารถใช้ฟังก์ชันนี้เพื่อจัดเรียงปลายทางทั้งหมดตามเวลาที่เที่ยวบินสุดท้ายมาถึงที่ปลายทางเช่นกัน วิธีนี้จะทำให้ค้นหาในฐานข้อมูลได้เพียงคำสั่งเดียว:
return Destination::orderByDesc(
Flight::select('arrived_at')
->whereColumn('destination_id', 'destinations.id')
->orderBy('arrived_at', 'desc')
->limit(1)
)->get();
ค้นหาโมเดล / ชุดข้อมูลเดี่ยว
นอกจากการค้นหาเฉพาะบันทึกทั้งหมดจากตารางเฉพาะ คุณสามารถใช้ find, first หรือ firstWhere เพื่อดึงบันทึกเพียงรายการเดียว วิธีเหล่านี้จะส่งคืนโมเดลตัวเดียว แทนที่จะส่งคืนชุดโมเดล:
// ค้นหาโมเดลผ่าน primary key...
$flight = app\model\Flight::find(1);
// ค้นหาโมเดลแรกที่ตรงตามเงื่อนไข...
$flight = app\model\Flight::where('active', 1)->first();
// ค้นหาโมเดลแรกที่ตรงตามเงื่อนไขอย่างรวดเร็ว...
$flight = app\model\Flight::firstWhere('active', 1);
คุณยังสามารถใช้อาร์เรย์ของ primary key เป็นพารามิเตอร์ในการเรียกใช้ find ซึ่งจะส่งคืนชุดบันทึกที่ตรงกัน:
$flights = app\model\Flight::find([1, 2, 3]);
บางครั้งคุณอาจต้องการทำการทำอย่างอื่นเมื่อค้นหารายการแรกแล้วไม่พบค่า firstOr วิธีนี้จะส่งคืนรายการแรกเมื่อพบค่า หากไม่มีผลลัพธ์ ก็จะดำเนินการตามที่ระบุได้ การคืนค่าของคำสั่งจะเป็นผลลัพธ์ของ firstOr:
$model = app\model\Flight::where('legs', '>', 100)->firstOr(function () {
// ...
});
firstOr ยังรับอาร์เรย์ของฟิลด์เพื่อทำการค้นหา:
$model = app\model\Flight::where('legs', '>', 100)
->firstOr(['id', 'legs'], function () {
// ...
});
ข้อยกเว้น "ไม่พบ"
บางครั้งคุณอาจต้องการโยนข้อยกเว้นเมื่อไม่พบโมเดล สิ่งนี้มีประโยชน์มากในตัวควบคุมและเส้นทาง findOrFail และ firstOrFail จะดึงผลลัพธ์แรกจากการค้นหา หากไม่พบจะโยนข้อยกเว้น Illuminate\Database\Eloquent\ModelNotFoundException:
$model = app\model\Flight::findOrFail(1);
$model = app\model\Flight::where('legs', '>', 100)->firstOrFail();
การเรียกค้นชุดข้อมูล
คุณยังสามารถใช้วิธี count, sum และ max ที่เสนอโดยตัวสร้างคำสั่งค้นหา รวมถึงฟังก์ชันชุดข้อมูลอื่นๆ เพื่อจัดการกับชุดข้อมูล วิธีเหล่านี้จะส่งคืนค่าที่เหมาะสมแทนที่จะเป็นโมเดล:
$count = app\model\Flight::where('active', 1)->count();
$max = app\model\Flight::where('active', 1)->max('price');
การแทรก
เพื่อเพิ่มบันทึกใหม่ลงในฐานข้อมูล ให้สร้างอินสแตนซ์โมเดลใหม่ ตั้งค่าคุณสมบัติในอินสแตนซ์ แล้วเรียกใช้วิธี save:
<?php
namespace app\controller;
use app\model\User;
use support\Request;
use support\Response;
class FooController
{
/**
* เพิ่มบันทึกใหม่ในตารางผู้ใช้
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// ตรวจสอบคำขอ
$user = new User;
$user->name = $request->get('name');
$user->save();
}
}
created_at และ updated_at timestamps จะถูกตั้งค่าโดยอัตโนมัติ (เมื่อคุณสมบัติ $timestamps ในโมเดลเป็น true) โดยไม่ต้องกำหนดค่าโดยตรง
การอัปเดต
วิธี save ยังสามารถใช้ในการอัปเดตโมเดลที่มีอยู่ในฐานข้อมูล สำหรับการอัปเดตโมเดล คุณต้องทำการเรียกค้น ค่าอัปเดตคุณสมบัติ แล้วเรียกใช้วิธี save เช่นกัน timestamps ของ updated_at จะถูกอัปเดตโดยอัตโนมัติ ดังนั้นคุณจึงไม่ต้องกำหนดค่าโดยตรง:
$user = app\model\User::find(1);
$user->name = 'jerry';
$user->save();
อัปเดตแบบกลุ่ม
app\model\User::where('uid', '>', 10)
->update(['name' => 'tom']);
ตรวจสอบการเปลี่ยนแปลงคุณสมบัติ
Eloquent มีวิธีการคือ isDirty, isClean และ wasChanged เพื่อทำการตรวจสอบสถานะภายในของโมเดลและกำหนดว่าคุณสมบัติใดมีการเปลี่ยนแปลงตั้งแต่ถูกโหลดครั้งแรก
isDirty จะกำหนดว่ามีการเปลี่ยนแปลงคุณสมบัติตั้งแต่โหลดโมเดล หากคุณต้องการตรวจสอบคุณสมบัติที่เฉพาะเจาะจง สามารถส่งชื่อคุณสมบัติเพื่อให้ได้ผลลัพธ์ที่มีชื่อเสียหายเฉพาะ isClean จะตรงกันข้ามกับ isDirty และยังรองรับพารามิเตอร์คุณสมบัติแบบเลือก:
$user = User::create([
'first_name' => 'Taylor',
'last_name' => 'Otwell',
'title' => 'Developer',
]);
$user->title = 'Painter';
$user->isDirty(); // true
$user->isDirty('title'); // true
$user->isDirty('first_name'); // false
$user->isClean(); // false
$user->isClean('title'); // false
$user->isClean('first_name'); // true
$user->save();
$user->isDirty(); // false
$user->isClean(); // true
wasChanged จะกำหนดว่ามีคุณสมบัติใดที่ได้รับการเปลี่ยนแปลงในรอบคำขอปัจจุบัน ในการตรวจสอบการเปลี่ยนแปลงคุณสมบัติเฉพาะ ท่านสามารถส่งชื่อที่ต้องการเพื่อดูว่ามีการเปลี่ยนแปลงหรือไม่:
$user = User::create([
'first_name' => 'Taylor',
'last_name' => 'Otwell',
'title' => 'Developer',
]);
$user->title = 'Painter';
$user->save();
$user->wasChanged(); // true
$user->wasChanged('title'); // true
$user->wasChanged('first_name'); // false
การกำหนดค่าแบบกลุ่ม
คุณยังสามารถใช้วิธี create เพื่อบันทึกโมเดลใหม่ โดยวิธีนี้จะส่งคืนอินสแตนซ์โมเดล อย่างไรก็ตาม ก่อนที่คุณจะใช้งาน คุณต้องกำหนดคุณสมบัติ fillable หรือ guarded ในโมเดล เนื่องจากโมเดล Eloquent ทั้งหมดโดยค่าเริ่มต้นจะไม่อนุญาตให้ทำการกำหนดค่าแบบกลุ่ม
หากผู้ใช้ส่ง HTTP พารามิเตอร์ที่ไม่คาดคิดผ่านคำขอและพารามิเตอร์นั้นเปลี่ยนแปลงฟิลด์ในฐานข้อมูลที่คุณไม่ต้องการเปลี่ยนแปลง ก็อาจส่งผลต่อการตั้งค่าแบบกลุ่มได้ เช่น ผู้ใช้งานอาจมีเจตนาร้ายโดยการส่งค่า is_admin ผ่านคำขอ HTTP และส่งไปยังวิธีการ create ซึ่งอาจทำให้สามารถอัปเกรดตัวเองเป็นผู้ดูแลระบบได้
ดังนั้น ก่อนเริ่มต้น คุณควรกำหนดคุณสมบัติในโมเดลว่าคุณสมบัติใดที่สามารถกำหนดค่าได้แบบกลุ่ม คุณสามารถใช้คุณสมบัติ $fillable ในโมเดลเพื่อบรรลุวัตถุประสงค์นี้ ตัวอย่างเช่น ให้โมเดล Flight มีคุณสมบัติ name ที่สามารถกำหนดค่าได้แบบกลุ่ม:
<?php
namespace app\model;
use support\Model;
class Flight extends Model
{
/**
* คุณสมบัติที่สามารถกำหนดค่าได้แบบกลุ่ม
*
* @var array
*/
protected $fillable = ['name'];
}
เมื่อเรากำหนดคุณสมบัติที่สามารถกำหนดค่าได้แบบกลุ่มแล้ว เราสามารถใช้วิธี create เพื่อใส่ข้อมูลใหม่ลงในฐานข้อมูลได้ โดยที่ create จะส่งคืนอินสแตนซ์โมเดลที่ถูกบันทึก:
$flight = app\model\Flight::create(['name' => 'Flight 10']);
หากคุณมีอินสแตนซ์โมเดลอยู่แล้ว คุณสามารถส่งอาร์เรย์ให้กับวิธี fill เพื่อกำหนดค่าได้:
$flight->fill(['name' => 'Flight 22']);
$fillable จึงสามารถมองว่าเป็น "บัญชีขาว" ของการกำหนดค่าแบบกลุ่ม และคุณก็สามารถใช้ $guarded เพื่อทำรายการ "บัญชีดำ" ของการกำหนดค่าแบบกลุ่ม การระบุแต่ละค่าที่ไม่อนุญาตให้กำหนดค่าแบบกลุ่ม คุณสามารถทำให้ $guarded เป็นอาร์เรย์ว่างเพื่อให้อนุญาตให้กำหนดค่าทุกๆ คุณสมบัติแบบกลุ่มได้:
<?php
namespace app\model;
use support\Model;
class Flight extends Model
{
/**
* คุณสมบัติที่ไม่อนุญาตให้กำหนดค่าแบบกลุ่ม
*
* @var array
*/
protected $guarded = ['price'];
}
หากต้องการให้ทุกคุณสมบัติสามารถกำหนดค่าแบบกลุ่ม มีการตั้งค่า $guarded ให้เป็นอาร์เรย์ว่างดังนี้:
/**
* คุณสมบัติที่ไม่อนุญาตให้กำหนดค่าแบบกลุ่ม
*
* @var array
*/
protected $guarded = [];
วิธีการสร้างอื่นๆ
firstOrCreate/ firstOrNew
นี่คือสองวิธีที่คุณอาจใช้ในการกำหนดค่าแบบกลุ่ม: firstOrCreate และ firstOrNew วิธี firstOrCreate จะลองจับคู่ข้อมูลในฐานข้อมูลโดยใช้คู่คีย์/ค่าสำหรับการสร้างบันทึกใหม่ หากไม่พบโมเดลในฐานข้อมูลจะมีการแทรกรายการ ซึ่งมีคุณสมบัติจากพารามิเตอร์แรกพร้อมกับพารามิเตอร์ที่สองในรูปแบบทางเลือก
firstOrNew จะค้นหาบันทึกในฐานข้อมูลตามคุณสมบัติที่กำหนด หากไม่พบ โมเดลจะถูกสร้างขึ้นเป็นอินสแตนซ์ใหม่ โปรดทราบว่าอินสแตนซ์ที่ถูกส่งคืนโดย firstOrNew จะยังไม่ถูกบันทึกในฐานข้อมูล และคุณจำเป็นต้องเรียกใช้วิธี save เพื่อบันทึกมัน:
// ค้นหาเที่ยวบินโดยใช้ name หากไม่พบให้สร้าง...
$flight = app\model\Flight::firstOrCreate(['name' => 'Flight 10']);
// ค้นหาเที่ยวบินโดยใช้ name หรือใช้ name กับ delayed และ arrival_time...
$flight = app\model\Flight::firstOrCreate(
['name' => 'Flight 10'],
['delayed' => 1, 'arrival_time' => '11:30']
);
// ค้นหาเที่ยวบินโดยใช้ name หากไม่พบให้สร้างอินสแตนซ์ใหม่...
$flight = app\model\Flight::firstOrNew(['name' => 'Flight 10']);
// ค้นหาเที่ยวบินโดยใช้ name หรือสร้างอินสแตนซ์ใหม่โดยใช้ name, delayed และ arrival_time...
$flight = app\model\Flight::firstOrNew(
['name' => 'Flight 10'],
['delayed' => 1, 'arrival_time' => '11:30']
);
คุณอาจพบสถานการณ์ที่ต้องการอัปเดตโมเดลที่มีอยู่ หรือหากไม่พบให้สร้างโมเดลใหม่ คุณสามารถใช้วิธี updateOrCreate เพื่อทำการอัปเดตหรือสร้างโมเดลใหม่ในครั้งเดียว ตัวอย่างเช่น:
// ถ้ามีเที่ยวบินจาก Oakland ไปยัง San Diego ราคาเป็น 99 ดอลลาร์
// ถ้าไม่พบโมเดลที่ตรงกัน จะทำการสร้างโมเดลใหม่
$flight = app\model\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99, 'discounted' => 1]
);
การลบโมเดล
คุณสามารถเรียกใช้วิธี delete ในโมเดลอินสแตนซ์เพื่อลบอินสแตนซ์:
$flight = app\model\Flight::find(1);
$flight->delete();
การลบโมเดลโดยใช้ Primary Key
app\model\Flight::destroy(1);
app\model\Flight::destroy(1, 2, 3);
app\model\Flight::destroy([1, 2, 3]);
app\model\Flight::destroy(collect([1, 2, 3]));
การลบโมเดลโดยใช้ Query
$deletedRows = app\model\Flight::where('active', 0)->delete();
การทำสำเนาโมเดล
คุณสามารถใช้วิธี replicate เพื่อทำสำเนาอินสแตนซ์ใหม่ซึ่งยังไม่ได้บันทึกลงในฐานข้อมูล วิธีนี้มีประโยชน์เมื่อโมเดลอินสแตนซ์มีคุณสมบัติเหมือนกันมากมาย
$shipping = App\Address::create([
'type' => 'shipping',
'line_1' => '123 Example Street',
'city' => 'Victorville',
'state' => 'CA',
'postcode' => '90001',
]);
$billing = $shipping->replicate()->fill([
'type' => 'billing'
]);
$billing->save();
การเปรียบเทียบโมเดล
บางครั้งอาจจำเป็นต้องตัดสินใจว่าโมเดลสองชิ้นเดียวกันหรือไม่ วิธี is สามารถใช้ตรวจสอบว่าโมเดลสองชิ้นมี primary key, ตาราง และการเชื่อมต่อฐานข้อมูลเดียวกันหรือไม่:
if ($post->is($anotherPost)) {
//
}
โมเดลออเบเซอเวอร์
ดูเพิ่มเติมเกี่ยวกับอีเวนต์โมเดลและ Observer ใน Laravel
หมายเหตุ: Eloquent ORM ต้องการให้มีการนำเข้า composer require "illuminate/events" เพื่อสนับสนุนโมเดลออเบเซอเวอร์
<?php
namespace app\model;
use support\Model;
use app\observer\UserObserver;
class User extends Model
{
public static function boot()
{
parent::boot();
static::observe(UserObserver::class);
}
}
ธุรกรรม
ดูที่ธุรกรรมฐานข้อมูล