balfour/eloquent-dynamic-relationships

一个用于在运行时对 Eloquent 模型之间的关系进行猴子补丁的库

0.0.1-alpha 2020-02-26 09:29 UTC

This package is auto-updated.

Last update: 2024-09-26 19:32:25 UTC


README

一个用于在运行时对 Eloquent 模型之间的关系进行猴子补丁的库。

您可以在任何 Laravel 应用程序或使用 Eloquent ORM 的独立应用程序中使用此库。

此库处于早期发布阶段,并正在等待单元测试。

用例

当我们在内部模块化系统中需要将多个包(和存储库)中分离的模型绑定在一起时,我们开发了此库。

让我们考虑以下系统

  • 框架 - 将模块粘合在一起的大脑。
  • 用户 模块 - 一个允许用户登录、注册等的包。
  • 短信 模块 - 一个允许用户发送短信的包。

这些是存储在独立存储库中的 3 个独立包,彼此之间只有最基本的知识。

  • 框架了解 用户短信 模块。
  • 用户 模块没有依赖项。
  • 短信 模块了解 用户 模块。

在这个系统中,消息 模型可以定义它与 用户 模型的 多对一 关系;然而,用户 模型没有 短信 包的上下文,因此无法定义反向的 一对多 关系。

例如:$message->user 会成功,但 $user->messages$user->messages()->paginate() 会引发错误。

因此,责任落在 框架 上,在 用户 模型上猴子补丁这种反向关系。

安装

composer require balfour/eloquent-dynamic-relationships

此包只需在包含您想要进行猴子补丁的模型的存储库(或存储库)中安装。

使用方法

配置可猴子补丁模型

您想要进行猴子补丁的模型需要扩展我们的基本模型或使用 HasDynamicRelationships 特性。

方法 1(首选)

namespace SMSModule;

use Balfour\EloquentDynamicRelationships\HasDynamicRelationships;
use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    use HasDynamicRelationships;
    
    //
}

方法 2

namespace SMSModule;

use Balfour\EloquentDynamicRelationships\Model;

class Message extends Model
{
    //   
}

创建动态关系

在将所有内容粘合在一起的基础框架代码库中,您需要将两个模型绑定在一起。这通常在应用程序的 AppServiceProvider 启动时完成。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use SMSModule\Message;
use UserModule\User;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        UserModule::bond('messages', function () {
            return $this->hasMany(Message::class);
        });
    }
}

在两个模型之间建立了联系后,您现在可以像平常一样使用关系调用。

例如

use SMSModule\Message;
use UserModule\User;

$user = User::find(1);

// retrieve a user's messages
$messages = $user->messages;

// retrieve and sort a user's messages by send date
$messages = $user->messages()
    ->latest('send_date')
    ->get();
    
// paginate a user's messages
$messages = $user->messages()
    ->paginate();

// get the user who sent the message
$message = Message::first();
$user = $message->user;

其他方法

use UserModule\User;

// destroy a bond between 2 models
User::breakup('activities');

// retrieve all dynamic bonds
$bonds = User::getBonds();

// determine if a model is bonded with another
User::isBondedWith('activities');