alexinator1 / yii2-jta
Yii2 扩展允许访问连接表的属性,并将它们作为子模型属性附加到多对多关系
v0.3
2017-01-30 14:04 UTC
Requires
- yiisoft/yii2: >=2.0.4
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 类。
考虑以下方案
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
文件。