alexinator1/yii2-jta

Yii2 扩展允许访问连接表的属性,并将它们作为子模型属性附加到多对多关系

安装次数: 5,329

依赖项: 0

建议者: 0

安全: 0

星级: 6

关注者: 2

分支: 4

公开问题: 3

类型:yii2-extension

v0.3 2017-01-30 14:04 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:16:02 UTC


README

一个简单的扩展允许以 ORM 方式访问连接表的列值,而无需在多对多关系中对该表声明额外的模型。扩展重写了 \yii\db\ActiveQuery::viaTable(),并允许传递一个数组,其中包含连接表的列名,这些列将被附加到子模型作为属性。

要求

  • Yii 2.0
  • PHP 5.4

安装

安装此扩展的首选方式是通过 Composer

运行以下命令之一:

$ composer require alexinator1/yii2-jta

或者添加以下内容到您的 composer.json 文件的 require 部分:

"alexinator1/yii2-jta": "*"

使用

用法

只需让您的两个相关模型类(多对多关系中的)继承自 alexinator1\jta\ActiveRecord 类。

考虑以下方案

Database scheme for example

class User extends \alexinator1\jta\ActiveRecord
{
    ....
}
class Group extends \alexinator1\jta\ActiveRecord
{
    ....
}

并将要附加到子模型的属性名数组传递给 viaTable 方法

class Group extends \alexinator1\jta\ActiveRecord
{
    ...
    
    public function getUsers()
    {
        return $this->hasMany(User::className(), ['id' => 'user_id'])
            ->viaTable('user_group', ['group_id' => 'id'], null, ['role', 'joined_at']);
    }

    ...
}

这样就可以了。现在子模型具有一个名为 pivot 属性的属性,其中包含相应的值数组,按父 ID 索引。因此,不能以下方式访问它

延迟加载

    $group = Group::findOne($groupId);
    foreach($group->users as $user)
    {
        $role = $user->role[$group->id];
        $joinDate = $user->joined_at[$group->id];
        ...
    }

预加载

    $group = Group::find()->where($groupId)->with('users')->all();
    foreach($group->users as $user)
    {
        $role = $user->role[$group->id];
        $joinDate = $user->joined_at[$group->id];
        ...
    }

使用 'joinWith' 方法进行预加载

    $groups =  Group::find()->joinWith('users')->all();

    foreach($groups as $group){
        foreach($group->users as $user)
        {
            $role = $user->role[$group->id];
            ...
        }
    }

也适用于 'array' 模型

    $group = Group::find()
        ->with('users')
        ->where($groupId)
        ->asArray()
        ->one();
    foreach($group['users'] as $user)
    {
        $role = $user['role'];
        $joinDate = $user['joined_at'];
        ...
    }

案例页面!

您可以在 DEMO 页面找到更多代码示例。以及在 DEMO 页面存储库 上的一些单元测试

注意!

Attached pivot attributes are read-only and acceptable only for models 
were populated via relation. They overwrite all other none-declared model properties
(declared via getter or corresponded to table columns)
and are overwritten by declared properties.

失败用例

如果您发现任何扩展无法正常工作的用例,请随时提交问题或发送电子邮件给我。我们将尽快处理。

许可证

**yii2 连接表属性** 根据 MIT 许可证发布。有关详细信息,请参阅捆绑的 LICENSE.md 文件。

资源