zoukankan      html  css  js  c++  java
  • Yii ActiveRecord 的via和viaTable示例

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

        

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

    用户表

    数据:

    权限表

    数据:

    关联表

    数据:

    然后创建权力模型

    <?php
    
    namespace appmodels;
    
    use yiidbActiveRecord;
    
    class Power extends ActiveRecord
    {
        public static function tableName()
        {
            return 'power';
        }
    }
    

    用户模型

    <?php
    
    namespace appmodels;
    
    use yiidbActiveRecord;
    use appmodelsPower;
    
    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 appmodels;
    
    use yiidbActiveRecord;
    
    class UserPower extends ActiveRecord
    {
        public static function tableName()
        {
            return 'users-power';
        }
    }

    控制器代码

    <?php
    
    namespace appcontrollers;
    
    use yiiwebController;
    use appmodelsUsers;
    use appmodelsPower;
    
    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 appmodels;
    
    use yiidbActiveRecord;
    use appmodelsPower;
    use appmodelsUserPower;
    
    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');
        }
    }
    

    运行:

  • 相关阅读:
    移动端html的overflow:hidden属性失效问题
    js获取url传递参数,js获取url?号后面的参数
    zoom和transform:scale的区别
    css媒体查询来书写二倍图三倍图设置
    ajax和promise的结合使用
    react-router 嵌套路由 内层route找不到
    antd中按需加载使用react-app-rewired报错
    ts+antd报错error TS2605: JSX element type Xxx is not a constructor function for JSX elements
    在taro中跳转页面的时候执行两遍componentDidMount周期的原因和解决方法
    HDU 4602 Partition (矩阵乘法)
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5954615.html
Copyright © 2011-2022 走看看