awobaz/compoships

Laravel 关联支持复合/多键

资助包维护!
paypal.me/awobaz

安装: 6,166,546

依赖项: 30

建议者: 3

安全性: 0

星星: 1,106

关注者: 13

分支: 130

开放问题: 29

2.3.0 2024-02-28 22:21 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);
    }
}

相关讨论

安装

安装 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']);
    }
}

工厂

您可能需要为 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 版本增加了对可空列的支持。当关系中的列值为空时,结果可能与 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

作者

支持此项目

Buy Me a Coffee via Paypal

许可证

Compoships 采用 MIT 许可证 许可。