Laravel Model 利用 Macroable 為資料模型新增宏能力
【摘要】簡單的說一下宏能力,這個類是 Illuminate\Support\Traits\Macroable 其中利用過載實現了可以定義宏的功能,即透過 macro 靜態方法新增回撥,並定義一個名字。利用 __call 當前類沒有這個函式的時候執行這個函式名註冊的回撥。
產生需求
在使用 Laravel 開發 ThinkSNS Plus 的時候,因為很多功能塊都沒有寫在一個庫裡面,利用擴充包的形式新增實際功能,裡面很多地方也用到了“多型多對多”的關係。問題來了,開發一個問答程式,想要給使用者模型增加發布的問題或者回答的關係,起初是繼承一份 User 模型,新增了關係,之後就發現問題了,因為使用者的 tag 是使用多型多對多的關係,我透過繼承的使用者模型是無法拿到這種關係資料的因為 ***able_type 是 user 資料模型類名稱或者別名。而我繼承之後類也就發生改變了。
完成需求
隨之想到,在 Laravel 中有一個 Trait 叫做 Macroable 然後發現 Builder 都有這種能力,而 Model 沒有,隨之也將這個 Trait新增到要使用的model上,後來發現,如果其他模型也要用是不是也要再新增一次?隨之寫了一份 Trait :
產生需求
在使用 Laravel 開發 ThinkSNS Plus 的時候,因為很多功能塊都沒有寫在一個庫裡面,利用擴充包的形式新增實際功能,裡面很多地方也用到了“多型多對多”的關係。問題來了,開發一個問答程式,想要給使用者模型增加發布的問題或者回答的關係,起初是繼承一份 User 模型,新增了關係,之後就發現問題了,因為使用者的 tag 是使用多型多對多的關係,我透過繼承的使用者模型是無法拿到這種關係資料的因為 ***able_type 是 user 資料模型類名稱或者別名。而我繼承之後類也就發生改變了。
完成需求
隨之想到,在 Laravel 中有一個 Trait 叫做 Macroable 然後發現 Builder 都有這種能力,而 Model 沒有,隨之也將這個 Trait新增到要使用的model上,後來發現,如果其他模型也要用是不是也要再新增一次?隨之寫了一份 Trait :
trait Macroable { use \Illuminate\Support\Traits\Macroable { __call as macroCall; } /** * Get a relationship value from a method. * * @param string $key * @return mixed * @author Seven Du <shiweidu@outlook.com> */ public function getRelationValue($key) { $relation = parent::getRelationValue($key); if (! $relation && static::hasMacro($key)) { return $this->getRelationshipFromMethod($key); } return $relation; } /** * Handle dynamic method calls into the model. * * @param string $method * @param array $parameters * @return mixed * @author Seven Du <shiweidu@outlook.com> */ public function __call($method, $parameters) { if (static::hasMacro($method)) { return $this->macroCall($method, $parameters); } return parent::__call($method, $parameters); } /** * Handle dynamic static method calls into the method. * * @param string $method * @param array $parameters * @return mixed */ public static function __callStatic($method, $parameters) { return parent::__callStatic($method, $parameters); } }
只要在要使用的 model 中 use 即可。
使用
有了這個 Trait 那麼我們新增到 User 模型中,就可以使用宏能力為其動態新增函式了:
User::macro('questions', function () { return $this->hasMany(Question::class, 'user_id', 'id'); });
這樣,我們可以直接 :
$questions = $user->questions;
拿到使用者釋出的所有問題了。
以上程式碼都來自於 Plus,看完整的開發程式碼可以看倉庫:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31448874/viewspace-2143938/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel Model 利用 Macroable 為資料模型新增巨集能力。LaravelMac模型
- 深入淺出 Laravel MacroableLaravelMac
- 利用 Laravel Macroable 特性優化多型引數傳遞的技巧分享LaravelMac優化多型
- orm中使用modelForm新增資料ORM
- CDM(Conceptual Data Model,概念資料模型)和 PDM(Physical Data Model,物理資料模型)模型
- Laravel Database——Eloquent Model 更新關聯模型LaravelDatabase模型
- 利用聚寬(Joinquant)資料來源為vnpy新增期貨行情資料
- ReplaceableModel:為 Eloquent 模型新增 REPLACE 和 INSERT IGNORE 查詢功能模型
- activiti 新增流程模型並返回 modelId模型
- laravel建立新model資料的兩種方法Laravel
- Laravel模型工廠填充資料Laravel模型
- 利用CSOM向列表新增資料夾
- 使用 nestedset 的 NodeTrait 替代 Laravel-admin 的 ModelTree 來實現資料模型樹AILaravel模型
- laravel 新增一條資料並返回 IDLaravel
- 7000字長文 | 資料分析師能力模型模型
- 13、flask-模型-models-模型配置使用-資料遷移Flask模型
- Laravel 中利用『模型事件』來實現刪除資料時的連帶刪除Laravel模型事件
- 如何利用資料庫的可觀測效能力資料庫
- Laravel 使用多資料庫和 Model 表名去 sLaravel資料庫
- C++ Qt開發:StandardItemModel資料模型元件C++QT模型元件
- C/C++ Qt StandardItemModel 資料模型應用C++QT模型
- [大資料][機器學習]之Model Card(模型卡片)介紹大資料機器學習模型
- Laravel 中簡約而不簡單的 Macroable 巨集指令LaravelMac
- Laravel model filterLaravelFilter
- laravel model relationshipLaravel
- Laravel 資料遷移給表新增註釋Laravel
- DCMM(資料管理能力成熟度模型)模型
- delphi基於資料模型(data-model)JSON序列模型JSON
- 無人車與宏觀交通:從微觀模型到宏觀模型模型
- 使用資料增強技術提升模型泛化能力模型
- Laravel model validationLaravel
- Laravel中的ModelLaravel
- Django模型modelDjango模型
- 為資料庫新增控制檔案資料庫
- Laravel Eloquent 關聯模型查詢快取資料Laravel模型快取
- 逆向工程——利用PowerDesigner將表結構轉為物理資料模型並轉換為圖片模型
- 使用property為類中的資料新增行為
- 強化版MacroableMac