Laradebut #5
關於 CRUD 外的一點小事
@author Cara Wang <caraw@cnyes.com>
@since 2016/11/29
Why Do We Need Framework in PHP ?
-
Framework 幫忙做了哪些事 ?
- 目錄結構
CodeIgniter
Laravel
Why Do We Need Framework in PHP ?
-
Framework 幫忙做了哪些事 ?
-
目錄結構
-
方便協同合作: 在同樣的規範與流程下寫程式
CodeIgniter
Phalcon
Laravel
Why Do We Need Framework in PHP ?
-
Framework 幫忙做了哪些事 ?
-
目錄結構
- 方便協同合作: 在同樣的規範與流程下寫程式
- 未來的自己也是一個要合作的對象
- 不用重複造輪子
Why Do We Need Framework in PHP ?
-
Framework 幫忙做了哪些事 ?
-
目錄結構
- 方便協同合作: 在同樣的規範下寫程式
-
不用重複造輪子
- 專注在開發要提供的服務上
- 加速完成速度
Why Do We Need Framework in PHP ?
-
依據自家需求來選擇 Framework
- 擇你所愛,愛你所選
- 享受 Framework 提供的功能,來讓合作與開發更快速
- 跟你的 Framework 學習
Why Do We Use Laravel ?
- 安心的跟著 Laravel 一起成長
Introduction to Eloquent
- 跟你的 Framework 學習: 我可以跟 Laravel 學什麼 ?
- Laravel 提供的 ORM
- Why Do We Need ORM ?
Introduction to Eloquent
- Laravel 提供的 ORM
-
Why Do We Need ORM ?
- Keep it simple
- 方便協同合作
- 安全性考量: SQL Injection
Introduction to Eloquent
-
如何使用
- 你有一個 Model
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
}
Introduction to Eloquent
- 如何使用
- 你開始使用 Model
Product::select('name', 'price')
->where('discount', '<', 1)
->first();
Introduction to Eloquent
- 如何使用
- 實際上組出來的 SQL
- 可以透過 ->toSql() 取得 ORM 實際組出來的 SQL
- 可以透過 ->getBindings() 取得 傳給 SQL 的變數
SELECT `name`, `price`
FROM `product`
WHERE `discount` < 1;
Introduction to Eloquent
CREATE TABLE `products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品流水號',
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '商品名稱',
`brand` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '品牌',
`type` varchar(255) COLLATE utf8_unicode_ci DEFAULT '' COMMENT '商品型號',
`price` double(8,2) NOT NULL,
`discount` double(8,2) NOT NULL DEFAULT '1.00',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1058 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Introduction to Eloquent
- 價格要乘以折扣數: 你可以這樣寫
- 分別取出 price 和 discount
- 相乘後在顯示到頁面上
- 還要小心記得要做四捨五入
- 但你用的是 Laravel, 所以你有更好的選擇
- 使用 Accessors
public function getPriceAttribute()
{
$price = (float)$this->attributes['price'];
$discount = (float)$this->attributes['discount'];
return (int) ceil($price * $discount);
}
Introduction to Eloquent
-
如果 discount 存錯值,問題就大條了!
- 不小心存成大於 1 的值
- 公司規定折扣數不會低於五折
- 你可以這樣寫
- 寫一個 checkValidDiscount(...) 的 Helper function
- 每次存入前就檢查一下
- 但你用的是 Laravel, 所以你有更好的選擇
- 使用 Mutator
public function setDiscountAttribute($value)
{
if ($value > 1) {
$value = 1;
} elseif ($value < 0.5) {
$value = 0.5;
}
$this->attributes['discount'] = $value;
}
Introduction to Eloquent
- 其他 Mutators 的例子
- 型號是顏色的話,結尾一定要是 色
public function setTypeAttribute($value)
{
if (((int)stripos($value, '色') - 1) !== mb_strlen($value)
&& in_array($value, self::$colors)) {
$value .= '色';
}
$this->attributes['type'] = $value;
}
Introduction to Eloquent
- 其他 Accessors 的例子
-
品名包含: 【品牌】品名 - 型號
Introduction to Eloquent
- 你可以這樣寫
- getProductName(...) 的 Helper function
- 從 Model 拿出 name、brand、type
- 一一丟進 getProductName(...) 中組出 【品牌】品名 - 型號
- 但你用的是 Laravel, 所以你有更好的選擇
- 使用 Accessors
public function getFullNameAttribute()
{
return sprintf(
'【%s】%s - %s',
$this->attributes['brand'],
$this->attributes['name'],
$this->attributes['type']
);
}
Introduction to Eloquent
-
可以利用 Accessors 設定不屬於資料表本身的欄位
- 看起來好像很好,只是...
- 難道我每次都要自己把 $xxx->fullName 放進要顯示的地方嗎?
- 別怕!你需要的是 $appends
protected $appends = ['fullName'];
Introduction to Eloquent
-
其他關於 Eloquent 的小事
- 設定 attributes 預設值
protected $attributes = [
'brand' => 'Laradebut'
'type' => ''
];
Introduction to Eloquent
-
其他關於 Eloquent 的小事
- 設定 attributes 預設值
-
設定 casts 資料型別
- price 必須是 integer
protected $casts = [
'price' => 'int',
'discount' => 'float'
];
Introduction to Eloquent
-
其他關於 Eloquent 的小事
- 設定 attributes 預設值
-
設定 casts 資料型別
- price 必須是 integer
- 有個小問題兒: 如果你用了 Mutator,設定 $casts 就會無效
in version: 5.3.24
Illuminate/Database/Eloquent/Model
Introduction to Eloquent
-
其他關於 Eloquent 的小事
- 設定 attributes 預設值
-
設定 casts 資料型別
- price 必須是 integer
-
設定 CREATED_AT 和 UPDATED_AT
const CREATED_AT = 'createdAt';
const UPDATED_AT = 'updatedAt';
Introduction to Eloquent
-
其他關於 Eloquent 的小事
- 設定 attributes 預設值
-
設定 casts 資料型別
- price 必須是 integer
-
設定 CREATED_AT 和 UPDATED_AT
- migration 得要自己設定
原本:
$table->timestamps();
更動 CREATED_AT 和 UPDATED_AT:
$table->timestamp('createdAt')->nullable();
$table->timestamp('updatedAt')->nullable();
Why Do We Use Laravel ?
- 使用並享受 Framework 帶來的好處
- 跟你的 Framework 學習
- 練習看 Source Code
- Demo Code
Q & A
2016/03
2016/05
2016/08
2016/12
Fork me on GitHub