關於網路那些事...

網路行銷,SEO,網路趨勢,教學文章,網頁設計,生活時事

Laravel - Eloquent model (二)

前面介紹過了如何建立 Model

這裡繼續用範例說明如何使用 Model 來進行數據操作

首先先建立一個 MemberController

php artisan make:controller MemberController

使用之前建立的 Members Models

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Members;

class MemberController extends Controller
{
}
?>

依序介紹新增、查詢、更新及刪除

1.新增資料

save()
底下範例可以直接 new Models 之後,指定欄位值
最後透過 save() 來將資料插入資料庫

<?php ...
    public function create(){
        $member = new Members;
        $member->name = 'a';
        $member->email = 'a@example.com';
        $member->sexual = 1;
        $member->save();
    }

create()

可以透過 Mass Assignment (批量分配)的方式,一行就指定好要插入的資料

但是在使用前要先在 Models 設定好 fillable 或 guarded

$fillable 是用來定義白名單,定義允許欄位名單
$guarded 是用來定義黑名單,定義不允許欄位名單

在這裡我們要先在 Models 定義允許名單,如下:

在這裡不設定黑名單,因此賦予一個空陣列
App\Models\Members.php

<?php
protected $fillable = ['name', 'email','sexual'];
protected $guarded = [];

接下來在 Controller 就能開始使用 create 批量分配新增一筆資料

create 最後會返回實體化 saved ,插入一筆資料

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Members;

class MemberController extends Controller
{
    public function create(){
        $member = Members::create([
            'name' => 'hi',
            'email' => 'hi@gmail.com',
            'sexual' => 1
            ]);
    }
}

2. 查詢資料

all()

一次取出資料表所有資料:

<?php ...
$member = Members::all();

可直接透過 foreach 取出值

<?php ...
foreach($member as $row){
echo 'name:'.$row->name.', email:'.$row->email.'sexual:'.$row->sexual."</br>";
}

query builder 設定條件

可以透過 query builder 指定條件來取得資料表資料:

<?php ...
$member = Members::where('sexual', 0)
->orderBy('name', 'desc')
->take(10)
->get();

chunk 分塊

如果需要一次取出上千筆資料,可以透過 chunk 指定資料切割分塊量,將資料分塊送到Closure進行彙整

這種方式可以大幅節省記憶體用量

<?php
Members::chunk(200, function ($member) {
    foreach($member as $row){
    echo 'name:'.$row->name.', email:'.$row->email.'sexual:'.$row->sexual."</br>";
}
});

cursor()

一次取出大量資料時,如果是使用 query builder 設定條件方式

也能夠使用 cursor 來達到節省記憶體

<?php
$member = Members::where('sexual', 1)->orderBy('name', 'desc')->take(10)->cursor();
    foreach($member as $row){
    echo 'name:'.$row->name.', email:'.$row->email.'sexual:'.$row->sexual."</br>";
}

3. 更新

update()

<?php 
Members::where('sexual',1)->update(['sexual'=>1]);

4. 刪除

delete()

可以直接透過 query builder 以及 delete() 直接刪除指定條件的資料

<?php ...
$member = Members::where('name','gu')->delete();

destroy()

透過 destroy 可以指定要刪除的 id

<?php ...
Members::destroy([7,8,9]);

soft delete 軟刪除

在前面 Eloquent 並沒有提到軟刪除的部分

軟刪除可以讓我們不會真的刪掉數據,而是會透過一個 deleted_at 欄位來辨識哪些資料有被刪除

再開始使用之前,要先在 schema 新增 $table->softDeletes(); 就能夠自動產生 delete_at 欄位

<?php
Schema::create('members', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 100)->nullable();
$table->string('email', 100)->unique();
$table->tinyInteger('sexual');
$table->timestamps();
$table->softDeletes();
});

Models 也要進行軟刪除設定

首先要載入 Illuminate\Database\Eloquent\SoftDeletes

並且$dates的屬性要加入 'deleted_at'

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Members extends Model
{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
    
    protected $table = 'members';
    protected $fillable = ['name', 'email','sexual'];
    protected $guarded = [];
}

接著透過 delete() 或者 destroy() 就能夠透過軟刪除的方式處理

當透過Model查詢資料時,就會自動排除透過軟刪除的資料

withTrashed 查詢包含軟刪除在內的所有資料

可以透過 withTrashed 取得所有資料,包含軟刪除的資料

<?php ...
Members::withTrashed()->get();
foreach($member as $row){
    echo 'id:'.$row->id.', name:'.$row->name.', email:'.$row->email.'sexual:'.$row->sexual."</br>";
}

onlyTrashed 查詢透過軟刪除的資料

<?php ...
$member = Members::onlyTrashed()->get();

restore 指定將以軟刪除的資料恢復

<?php
Members::where(['sexual'=>0])->restore();

forceDelete 強制刪除

在啟用軟刪除時,可以透過 forceDelete 真實的將指定的資料刪除掉

刪除後就會從資料表移除

<?php
Members::where('name','e')->forceDelete();

如果這篇文章對你有幫助,請在這裡點個讚



最新文章推薦