【问题标题】:Returning related data records in yii2 using relations使用关系返回yii2中的相关数据记录
【发布时间】:2016-07-22 08:40:16
【问题描述】:

我想获取用户及其角色的数据,但它返回错误:

SQLSTATE[42S22]:找不到列:1054 'on 子句'中的未知列 'auth_item.user_id' 正在执行的 SQL 是:SELECT COUNT(*) FROM `tblusers` LEFT JOIN `auth_item` ON `tblusers`.`id` = `auth_item`.`user_id`

我尝试过: 搜索模型

$query = User::find()->joinWith('role');

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort'=> ['defaultOrder' => ['id'=>SORT_ASC]],
        'pagination' => ['pageSize' => $pageSize]
    ]);

    return $dataProvider;

与用户模型的关系

public function getRole()
{
    // User has_one Role via Role.user_id -> id
    return $this->hasOne(Role::className(), ['user_id' => 'id']);
}

角色模型的关系

public function getUser()
{
     return $this->hasMany(User::className(), ['id' => 'user_id']);
}

这是完整的搜索:

public function search($params, $pageSize = 10)
{
   $query = User::find()->joinWith('role');

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort'=> ['defaultOrder' => ['id'=>SORT_ASC]],
        'pagination' => ['pageSize' => $pageSize]
    ]);

    return $dataProvider;
    die();

    // if user is not 'theCreator' ( You ), do not show him users with this role
     // if user is not 'theCreator' ( You ), do not show him users with this role
    if (Yii::$app->user->can('theCreator')) {
        $query->where(['!=', 'item_name', 'theCreator']);
    }

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort'=> ['defaultOrder' => ['id'=>SORT_ASC]],
        'pagination' => ['pageSize' => $pageSize]
    ]);

    // make item_name (Role) sortable
    $dataProvider->sort->attributes['item_name'] = [
        'asc' => ['item_name' => SORT_ASC],
        'desc' => ['item_name' => SORT_DESC],
    ];

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $query->andFilterWhere([
        'id' => $this->id,
        'status' => $this->status,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ]);

    $query->andFilterWhere(['like', 'username', $this->username])
          ->andFilterWhere(['like', 'email', $this->email])
          ->andFilterWhere(['like', 'item_name', $this->item_name]);

    return $dataProvider;
}

这是 authitem 模型

<?php 
  namespace app\rbac;

  use yii\db\ActiveRecord;
  use Yii;

    class AuthItem extends ActiveRecord
    {  public static function tableName()
   { 
    return '{{%auth_item}}';
   }
   public static function getRoles()
   {
    if (Yii::$app->user->can('theCreator')) 
    {
        return static::find()->select('name')->where(['type' => 1])->all();  
    }
    else
    {
        return static::find()->select('name')
                             ->where(['type' => 1])
                             ->andWhere(['!=', 'name', 'theCreator'])
                             ->all();
    }
  }        
  }

这是代码更新: 在这一行

$query = User::find()->joinWith('role'); 

它实际上与下面的授权分配有关:

<?php
namespace app\rbac;

  use app\models\User;
     use yii\db\ActiveRecord;
    use Yii;
     class Role extends ActiveRecord
   {
  public static function tableName()
   {
    return '{{%auth_assignment}}';
   }
   public function rules()
        {
    return [
        [['item_name'], 'required'],
        [['item_name'], 'string', 'max' => 64],
    ];
}

 public function attributeLabels()
{
    return [
        'item_name' => Yii::t('app', 'Role'),
    ];
}


public function getUser()
{
    // Role has_many User via User.id -> user_id
    return $this->hasMany(User::className(), ['id' => 'user_id']);
}


}

为什么会返回这个错误?

【问题讨论】:

  • 上传您的完整查询。错误与您上传的查询不匹配
  • 您的 auth_item 表中似乎没有 user_id 列 -- 显示 auth_item 相关模型或表架构
  • @scais 为什么 authitem 我希望它使用授权分配
  • @scais 为什么 authitem 我希望它使用 auth assignment 因为 auth assignment 有 id 字段
  • 我已经发帖回答希望有用

标签: php sql yii2


【解决方案1】:

如果您使用来自 yii2 的默认 rbac 模型/模块,可能是您关联了错误的模型/表 .. 因为 auth_itme 模型不包含 user_id 列

/**
* This is the model class for table "auth_item".
*
* @property string $name
* @property integer $type
* @property string $description
* @property string $rule_name
* @property string $data
* @property integer $created_at
* @property integer $updated_at

您可能想要关联包含 auth_item 和用户之间关系的 auth_assignment 表

/**
 * This is the model class for table "auth_assignment".
 *
 * @property string $item_name
 * @property string $user_id
 * @property integer $created_at
 *

【讨论】:

  • 我想.. auth_item 不包含 user_id .. (您也可以检查应该称为 auth_item 的数据库表 ..) auth_item 仅包含许可证名称(和类型)的主列表.... 如果您想查看连接到每个用户的身份验证,您必须查看分配模型,并可能将此模型与 auth_item 和用户联系起来
  • 我不明白的是,当 $query = User::find()->joinWith('role');加入角色会使用 role.php 中的身份验证分配更新代码
  • 评论分三部分:part1 如果我正确理解您的问题与在表格的列上显示错误的事实有关..通过验证您可以根据我的回复进行验证可以清楚地检查该错误是由于在关联表中,您使用的模型不存在您尝试使用的字段。我认为这是您问题的正确答案。
  • part 2 我还建议如果你想获得 auh_item 和 user .. 之间的关系,你应该使用 auth_assignment 模型,但是关于如何完成这方面我认为你应该使用一个新的具体问题。至于您的最新评论,由于两个原因无法理解。第一个原因是,如果您想创建一个读取查询(选择),该查询将改变与分配的关系..
  • part 3 第二个是我不知道你使用什么扩展或模块来管理 rbac .. 或者你想要达到什么结果。因为您的问题与它无法使用连接子句的事实有关..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多