ฐานข้อมูลโมเดล 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);
    }
}

ธุรกรรม

ดูที่ธุรกรรมฐานข้อมูล