artoodetoo/compoships

支持复合/多键的关系型Laravel

1.0.4.1 2018-06-15 15:38 UTC

This package is auto-updated.

Last update: 2024-08-29 04:37:44 UTC


README

Compoships 允许您在Laravel 5的Eloquent中指定基于两列(或更多)的关系。当与第三方或现有模式/数据库一起工作时,需要在Eloquent关系定义中匹配多个列的需求经常出现。

问题

Eloquent不支持复合键。因此,无法通过匹配多个列来定义一个模型到另一个模型的关系。当尝试使用where子句(如下例所示)进行预加载关系时,这不会工作,因为在处理关系时,$this->f2是null。

namespace App;

use Illuminate\Database\Eloquent\Model;

class Foo extends Model
{
    public function bars()
    {
        //WON'T WORK WITH EAGER LOADING!!!
        return $this->hasMany('Bar', 'f1', 'f1')->where('f2', $this->f2);
    }
}

相关讨论

安装

推荐通过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', ['f1', 'f2'], ['f1', 'f2']);
    }
}

我们可以使用相同的语法来定义关系的逆关系

namespace App;

use Illuminate\Database\Eloquent\Model;

class B extends Model
{
    use \Awobaz\Compoships\Compoships;
    
    public function a()
    {
        return $this->belongsTo('A', ['f1', 'f2'], ['f1', 'f2']);
    }
}

支持的关系

Compoships 只支持以下Laravel 5的Eloquent关系

  • hasOne
  • HasMany
  • belongsTo

免责声明

Compoships 不在Laravel 5的Eloquent中提供对复合键的支持。此包仅提供基于多个列指定关系的功能。我们相信所有模型表都应有一个单一的主键。但是,即使您的模型表只有一个主键,有时您也需要在关系定义中匹配许多列。

贡献

有关我们的行为准则和提交拉取请求的过程的详细信息,请参阅CONTRIBUTING.md

版本控制

我们使用SemVer进行版本控制。有关可用的版本,请参阅此存储库的标签

单元测试

要运行测试套件,请安装开发依赖项

$ composer install --dev

然后,运行以下命令

$ vendor/bin/phpunit

作者

许可协议

Compoships 采用 MIT 许可协议 许可。