Laravel 不在模型中定義關聯關係的解決方法(拒絕背鍋)

liaosp發表於2020-07-17

使用場景:

比如有一個部落格系統(User Blog)需要加入評論功能Comment

你在一個團隊中,每個成員都在一個單獨的模組上工作。

Blog模組不是您的。您的同事對此負責,並可以為其編寫程式碼。所以你儘可能的不在Blog 中修改,以免背鍋。(大專案場景)
在這裡插入圖片描述

通常的做法在User 和Blog 加入

public function comments() {
    return $this->hasMany(Comment::class); 
}

但是有時候編寫程式碼的時候不想影響 User 和Blog 的模型類,

那有什麼優雅的辦法可以實現關聯關係呢?

composer require imanghafoori/eloquent-relativity

在這裡插入圖片描述
在User 和 Blog 中use DynamicRelations

建立一個Provider

class CommentsServiceProvider 
{
    public function register () {

        User::has_many('comments', Comment::class);     // instead of defining method on the User class.
        Article::has_many('comments',  Comment::class);

        Comment::belongs_to('author', User::class);       // inverse of relations
        Comment::belongs_to('article',  Article::class);
    }

}

這樣你就可以在你的業務邏輯使用

User::find(1)->comments;
or 
User::find(1)->comments()->count();

當然, 你也可以像在普通關聯的用法一樣,加入自定義的需求:

User::has_many('comments', Comment::class)->orderBy('id', 'asc');

聰明的你 覺得這種場景,你會用到嗎?

和我做朋友?
原文:github.com/imanghafoori1/eloquent-...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章