hungcrush / compoships
Laravel关系支持复合/多键
资助包维护!
paypal.me/awobaz
Requires
- php: >=7.3
- illuminate/cache: ~5.4|~6.0|~7.0|~8.0
- illuminate/console: ~5.4|~6.0|~7.0|~8.0
- illuminate/database: ~5.4|~6.0|~7.0|~8.0
- illuminate/support: ~5.4|~6.0|~7.0|~8.0
Requires (Dev)
- fzaninotto/faker: ^1.8
- laravel/laravel: ~5.4|~6.0|~7.0
- phpunit/phpunit: 5.*
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.
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关联与多个列
安装
推荐通过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'], ['localKey1', 'localKey2']); } }
示例
例如,假设我们有一个任务列表,其中包含类别,由多个用户团队管理,其中
- 任务属于一个类别
- 任务被分配给一个团队
- 一个团队有多个用户
- 一个用户属于一个团队
- 一个用户负责一个任务类别
负责特定任务的用户是当前负责该团队内类别内的用户。
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版本带来了对可为空列的支持。当关系中的某列为null时,结果可能与1.x版本不同,因此我们将版本提升到2.x,因为这可能是破坏性变更。
免责声明
Compoships 并不支持 Laravel Eloquent 的组合键。本包仅提供根据多列指定关系的功能。我们认为所有模型的表都应该只有一个主键。但在某些情况下,即使模型的表只有一个主键,你仍然需要在关系的定义中匹配多列。
贡献
请阅读 CONTRIBUTING.md 了解我们的行为准则以及提交拉取请求的过程。
版本管理
我们使用 SemVer 进行版本管理。有关可用的版本,请参阅本仓库的 标签。
单元测试
为了运行测试套件,请安装开发依赖项
$ composer install --dev
然后,运行以下命令
$ vendor/bin/phpunit
作者
- Claudin J. Daniel - 初始工作
赞助商
- StockTreats - 提供交易技巧和技巧的股票市场洞察
- Awobaz - 位于加拿大蒙特利尔的 Web/Mobile 代理机构
许可证
Compoships 使用 MIT 许可证。