fagundes / compoships
Laravel 的关系,支持复合/多个键
资助包维护!
paypal.me/awobaz
Requires
- illuminate/database: >=5.6 <12.0
Requires (Dev)
- ext-sqlite3: *
- fakerphp/faker: ^1.18
- phpunit/phpunit: ^6.0|^8.0|^9.0|^10.0
Suggests
- awobaz/blade-active: Blade directives for the Laravel 'Active' package
- awobaz/eloquent-auto-append: Automatically append accessors to model serialization
- awobaz/eloquent-mutators: Reusable mutators (getters/setters) for Laravel 5's Eloquent
- awobaz/syntactic: Syntactic sugar for named and indexed parameters call.
This package is auto-updated.
Last update: 2024-09-19 12:33:14 UTC
README
Compoships 允许您根据 Laravel Eloquent ORM 中的两列(或更多列)来指定关系。当与第三方或现有架构/数据库一起工作时,通常需要在 Eloquent 关系定义中匹配多列。
问题
Eloquent 不支持复合键。因此,无法通过匹配多个列来定义一个模型与另一个模型之间的关系。当尝试使用 where 子句
(如下例所示)进行预加载时,将无法工作,因为处理关系时 $this->team_id 为 null。
namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { public function tasks() { //WON'T WORK WITH EAGER LOADING!!! return $this->hasMany(Task::class)->where('team_id', $this->team_id); } }
相关讨论
- 多键关系
- 查询关系时添加额外条件不起作用
- 在 Eager Loading 中查询关系时添加额外条件不起作用
- 具有 2 个外键的 BelongsTo 关系
- Laravel Eloquent:关系的多外键
- Laravel hasMany 关联多列
安装
推荐通过 Composer 安装 Compoships
$ composer require awobaz/compoships
用法
使用 Awobaz\Compoships\Database\Eloquent\Model
类
只需让您的模型类继承自 Awobaz\Compoships\Database\Eloquent\Model
基类。该 Awobaz\Compoships\Database\Eloquent\Model
扩展了 Eloquent
基类,而不改变其核心功能。
使用 Awobaz\Compoships\Compoships
特性
如果您无法从 Awobaz\Compoships\Database\Eloquent\Model
继承模型,则可以使用 Awobaz\Compoships\Compoships
特性。只需在模型中使用该特性。
注意:要定义从模型 A 到模型 B 的多列关系,两个模型必须都继承自 Awobaz\Compoships\Database\Eloquent\Model
或使用 Awobaz\Compoships\Compoships
特性。
语法
...现在我们可以通过匹配两列或多列(通过传递列数组而不是字符串)来定义从模型 A 到模型 B 的关系。
namespace App; use Illuminate\Database\Eloquent\Model; class A extends Model { use \Awobaz\Compoships\Compoships; public function b() { return $this->hasMany('B', ['foreignKey1', 'foreignKey2'], ['localKey1', 'localKey2']); } }
我们可以使用相同的语法来定义关系的逆关系
namespace App; use Illuminate\Database\Eloquent\Model; class B extends Model { use \Awobaz\Compoships\Compoships; public function a() { return $this->belongsTo('A', ['foreignKey1', 'foreignKey2'], ['ownerKey1', 'ownerKey2']); } }
工厂
您可能需要为 Compoships 模型创建工厂。如果是这样,您可能需要使用 Factory 方法来创建关系模型。例如,使用 ->has() 方法。只需在您的工厂类中使用 Awobaz\Compoships\Database\Eloquent\Factories\ComposhipsFactory
特性即可正确使用关系。
示例
例如,假设我们有一个任务列表,其中包含类别,由多个用户团队管理,其中
- 一个任务属于一个类别
- 一个任务分配给一个团队
- 一个团队有多个用户
- 一个用户属于一个团队
- 一个用户负责一个任务类别的任务
负责特定任务的当前用户是该用户所在团队内负责该类别的用户。
namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { use \Awobaz\Compoships\Compoships; public function tasks() { return $this->hasMany(Task::class, ['team_id', 'category_id'], ['team_id', 'category_id']); } }
再次,使用相同的语法来定义关系的逆关系
namespace App; use Illuminate\Database\Eloquent\Model; class Task extends Model { use \Awobaz\Compoships\Compoships; public function user() { return $this->belongsTo(User::class, ['team_id', 'category_id'], ['team_id', 'category_id']); } }
支持的关系
Compoships 仅支持以下 Laravel Eloquent 关系
- hasOne
- HasMany
- belongsTo
请注意,虽然 Compoships 支持可空列,但仅包含空值的关联目前是不可能的。
2.x 版本中的可空列支持
2.x 版本带来了对可空列的支持。当关系中的列值为空时,结果可能与 1.x 版本不同,因此我们将版本提升到 2.x,因为这可能会导致破坏性更改。
免责声明
Compoships 不在 Laravel 的 Eloquent 中提供对复合键的支持。此包仅提供基于多个列指定关系的功能。在 Laravel 项目中,建议所有模型的表都只有一个主键。但是,即使模型的表只有一个主键,在某些情况下,您可能需要在关系的定义中匹配多个列。
贡献
请阅读 CONTRIBUTING.md 以了解我们的行为准则和提交拉取请求的流程。
版本控制
我们使用 SemVer 进行版本控制。有关可用的版本,请参阅此存储库的 标签。
单元测试
要运行单元测试,您必须使用 PHPUnit
安装 compoships 存储库
git clone https://github.com/topclaudy/compoships.git
cd compoships
composer install
运行 PHPUnit
./vendor/bin/phpunit
作者
- Claudin J. Daniel - 初始工作
支持此项目
许可证
Compoships 根据 MIT 许可证 授权。