balfour / eloquent-dynamic-relationships
一个用于在运行时对 Eloquent 模型之间的关系进行猴子补丁的库
0.0.1-alpha
2020-02-26 09:29 UTC
Requires
- illuminate/database: ^5.7
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');