coding-linheng / compoships
支持复合/多键的超关系
支持包维护!
paypal.me/awobaz
Requires
- hyperf/database: ^3.0
Requires (Dev)
- ext-sqlite3: *
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-10 07:06:43 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); } }
相关讨论
- 多键关系
- 带有额外条件的查询关系不符合预期
- 在预加载中带有额外条件的查询关系不工作
- 具有两个外键的 BelongsTo 关系
- Laravel Eloquent:关系的多个外键
- Laravel hasMany 关联的多列
安装
安装 Compoships 的推荐方式是通过 Composer
$ 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']); } }
示例
例如,假设我们有一个任务列表,其中包含类别,由多个用户团队管理,其中
- 任务属于一个类别
- 任务被分配给一个团队
- 团队有许多用户
- 用户属于一个团队
- 用户负责一个任务类别
负责特定任务的用户是当前负责团队内该类别的用户。
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 支持可空列,但目前无法定义仅包含 null 值的关系。
2.x 版本中对可空列的支持
版本 2.x 引入了对可空列的支持。当关系中的列为空时,结果可能与 1.x 版本不同,因此我们将版本提升到 2.x,因为这可能是一个破坏性变更。
免责声明
Compoships 不在 Laravel 的 Eloquent 中提供对复合键的支持。此包仅提供根据多个列指定关系的功能。在 Laravel 项目中,建议所有模型的表只使用单个主键。但有时即使模型的表只有一个主键,您也需要在关系的定义中匹配多个列。
贡献
请阅读CONTRIBUTING.md,了解我们的行为准则以及提交拉取请求的过程。
版本控制
我们使用SemVer进行版本控制。有关可用的版本,请参阅此存储库的标签。
单元测试
要运行单元测试,您必须手动获取正确的PHPUnit版本。
示例
curl -L -O https://phar.phpunit.de/phpunit-9.phar mv phpunit-9.phar phpunit chmod +x phpunit ./phpunit
作者
- Claudin J. Daniel - 初始工作
赞助商
- StockTreats - 带有交易技巧和窍门的股市洞察力
- Awobaz - 加拿大蒙特利尔的Web/移动代理机构
许可证
Compoships 在MIT许可证下发布。