elkadrey / compoships
支持组合/多键的Laravel关系
资助包维护!
paypal.me/awobaz
Requires
- fakerphp/faker: *
- illuminate/database: >=5.6 < 12.0
Requires (Dev)
- ext-sqlite3: *
- phpunit/phpunit: ^6.0|^8.0|^9.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.
- dev-master
- 3.1.0
- 3.0.0
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.1.18
- 1.1.17
- 1.1.16
- 1.1.15
- 1.1.14
- 1.1.13
- 1.1.12
- 1.1.11
- 1.1.10
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
This package is auto-updated.
Last update: 2024-09-29 07:51:28 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); } }
相关讨论
- 多键关系
- 查询关系时添加额外条件不按预期工作
- 在预加载中查询关系时添加额外条件不工作
- 具有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支持可空列,但当前无法实现仅包含null值的关系。
2.x版本对可空列的支持
2.x版本引入了对可空列的支持。当一个关系中的列是null时,结果可能与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 - 初始工作
支持此项目
赞助商
- Awobaz - 加拿大蒙特利尔的Web/Mobile代理机构
许可
Compoships 采用MIT许可证。