Yii中,将两个不相关的表利用中间表关联有via和viaTable两种方法,这里通过用户权限查询来进行示例。

    

关系如上,需要建立三个表 用户表 权限表

用户表

数据:

权限表

数据:

关联表

数据:

然后创建权力模型

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Power extends ActiveRecord
{
public static function tableName()
{
return 'power';
}
}

用户模型

<?php

namespace app\models;

use yii\db\ActiveRecord;
use app\models\Power; class Users extends ActiveRecord
{
public static function tableName()
{
return 'users';
} public function getPower()
{
return $this -> hasMany(Power::class, ['id' => 'power_id']) -> viaTable('users-power', ['user_id' => 'user_id']);
}
}

关联模型:

<?php

namespace app\models;

use yii\db\ActiveRecord;

class UserPower extends ActiveRecord
{
public static function tableName()
{
return 'users-power';
}
}

控制器代码

<?php

namespace app\controllers;

use yii\web\Controller;
use app\models\Users;
use app\models\Power; class UserController extends Controller
{
public function actionIndex()
{
//查询user_id为6的用户权限
$user = Users::findOne(['user_id' => 6]);
print_r( $user -> getPower() -> asArray() -> all());
}
}

运行结果:

其中用户模型中通过viaTable来通过关联表查询

$this -> hasMany(Power::class, ['id' => 'power_id']) -> viaTable('users-power', ['user_id' => 'user_id']);

各个数组字段参数含义,hasMany第二个数组中,键名为前面的Power::class对应的模型id字段,值为关联表中前面Power::class的id对应的字段,即power表中的id对应关联表中的power_id, viaTable第二个参数数组,键名为关联表中的字段,值为当前primaryModel对应的字段,即关联表中的user_id对应当前user表中的user_id。

via方法

via参数为AR类中定义的关联名,修改用户模型:

<?php

namespace app\models;

use yii\db\ActiveRecord;
use app\models\Power;
use app\models\UserPower; class Users extends ActiveRecord
{
public static function tableName()
{
return 'users';
}
//通过getUserPower来进行操作
public function getUserPower()
{
return $this -> hasMany(UserPower::class, ['user_id' => 'user_id']);
} public function getPower($uid = 6)
{
return $this -> hasMany(Power::class, ['id' => 'power_id']) -> via('userPower');
}
}

运行:

最新文章

  1. Eclipse与Android源码中ProGuard工具的使用
  2. JAVA简单工厂模式(从现实生活角度理解代码原理)
  3. IIS7注册本机模块
  4. Windows Azure 上传 VM
  5. Emacs常用命令汇总
  6. 使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置
  7. SVN不出现绿色对勾的情况
  8. Apache Shiro java安全框架
  9. iOS 图片裁剪与修改
  10. Python 知识小tips
  11. laravel之路由
  12. PC滚动条样式
  13. 一个简单的Oracle和 SQLSERVER 重建所有表索引的办法
  14. linux文件软链接、硬链接
  15. HDU 6351 Naive Operations(线段树)
  16. ubuntu 下配置elasticSearch
  17. 百度公共dns
  18. 牛客练习赛9 B - 珂朵莉的值域连续段
  19. 【Educational Codeforces Round20】
  20. ACM学习历程—TopCoder SRM691 Div2

热门文章

  1. BZOJ 2693: jzptab [莫比乌斯反演 线性筛]
  2. Nginx深入详解之多进程网络模型
  3. vs2013 打开vs2010 找不到此项目类型所基于的应用程序 MVC2 升级 MVC5 不能加载Web项目
  4. js 页面刷新location.reload和location.replace的区别小结
  5. phpstorm 无法格式化代码
  6. Ajax入门(一)
  7. 【MySQL】mysql workbench
  8. Hibernate+EhCache配置二级缓存
  9. csv to splite db form
  10. svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupted的解决办法