溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel Model 利用 Macroable 為數據模型添加宏能力

發布時間:2020-07-16 01:18:37 來源:網絡 閱讀:732 作者:ThinkSNS官方 欄目:軟件技術

什么是ThinkSNS ?
ThinkSNS(簡稱TS),一款全平臺綜合性社交系統,為國內外大中小企業和創業者提供社會化軟件研發及技術解決方案。

產生需求
在使用 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;

拿到用戶發布的所有問題了。

以上代碼都來自于ThinkSNS Plus,看完整的開發代碼可以看倉庫:

GitHub: https://github.com/slimkit/thinksns-plus(開源不易,求 Star )

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女