前面介紹過了如何建立 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();