Php 将yii2中的相关属性传递给json输出

Php 将yii2中的相关属性传递给json输出,php,json,yii2,Php,Json,Yii2,我正在将数据返回到RESTAPI,我想返回属性和相关属性 [1]=> object(common\models\User)#119 (10) { ["_attributes":"yii\db\BaseActiveRecord":private]=> array(18) { ["id"]=> int(27) ["username"]=> string(8) "marshal2" ["email"]=> string(18) "mars

我正在将数据返回到RESTAPI,我想返回属性和相关属性

  [1]=>
 object(common\models\User)#119 (10) {
  ["_attributes":"yii\db\BaseActiveRecord":private]=>
array(18) {
  ["id"]=>
  int(27)
  ["username"]=>
  string(8) "marshal2"
  ["email"]=>
  string(18) "marshal2@gmail.com"
 }

["_related":"yii\db\BaseActiveRecord":private]=>
array(1) {
  ["role"]=>
  object(common\rbac\models\Role)#131 (8) {
    ["_attributes":"yii\db\BaseActiveRecord":private]=>
    array(3) {
      ["item_name"]=>
      string(23) "Tracking center officer"
      ["user_id"]=>
      int(27)

    }

  }
}
这就是我所拥有的

$query = User::find()->joinWith('role');
当我表演的时候

var_dump($query->all())
我得到一个表单数组(属性和相关属性)

}

通过将结果传递给json输出时

return ['data' => $query->all()];
仅传递属性,但不传递相关属性 这就是我得到的

"data": [
{
  "username": "admin",
  "email": "track.yard@gmail.com",

},
{
  //also id
  "username": "marshal1",
  "email": "marshal1@gmail.com",
  ..... and others

  //i expected to see a role name since there is a related attribute with user id
},
我需要添加什么才能同时传递相关属性 正如我所期望的那样,数据也会显示角色项名称

这是我的用户模型

    public $role;

public function rules()
{
    return [
        [['username', 'email'], 'filter', 'filter' => 'trim'],
        [['username','expires_on', 'email', 'status'], 'required'],
        ['email', 'email'],
       // ['expires_on', 'integer'],
        [['username','first_name','last_name','firebase_pwd','picture'], 'string', 'min' => 2, 'max' => 255],

        // password field is required on 'create' scenario
        ['password', 'required', 'on' => 'create'],
        // use passwordStrengthRule() method to determine password strength
        $this->passwordStrengthRule(),

        ['username', 'unique', 'message' => 'This username has already been taken.'],
        ['email', 'unique', 'message' => 'This email address has already been taken.'],
    ];
}

   public function fields()
{
    $fields = parent::fields();

    // remove fields that contain sensitive information
    unset($fields['auth_key'], $fields['password_hash'],
        $fields['password_reset_token'],
        $fields['created_at'],
        $fields['firebase_pwd'],
        $fields['updated_at'],
        $fields['id'],
        $fields['authtoken'],
        $fields['account_activation_token']
    );

    $fields['role'] =function ($model){ //added this to see if it'll work
        return $model->role->name;
    };


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

enter code here
关系仍在用户模型中

    public $role;

public function rules()
{
    return [
        [['username', 'email'], 'filter', 'filter' => 'trim'],
        [['username','expires_on', 'email', 'status'], 'required'],
        ['email', 'email'],
       // ['expires_on', 'integer'],
        [['username','first_name','last_name','firebase_pwd','picture'], 'string', 'min' => 2, 'max' => 255],

        // password field is required on 'create' scenario
        ['password', 'required', 'on' => 'create'],
        // use passwordStrengthRule() method to determine password strength
        $this->passwordStrengthRule(),

        ['username', 'unique', 'message' => 'This username has already been taken.'],
        ['email', 'unique', 'message' => 'This email address has already been taken.'],
    ];
}

   public function fields()
{
    $fields = parent::fields();

    // remove fields that contain sensitive information
    unset($fields['auth_key'], $fields['password_hash'],
        $fields['password_reset_token'],
        $fields['created_at'],
        $fields['firebase_pwd'],
        $fields['updated_at'],
        $fields['id'],
        $fields['authtoken'],
        $fields['account_activation_token']
    );

    $fields['role'] =function ($model){ //added this to see if it'll work
        return $model->role->name;
    };


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

enter code here

您可以将响应设置为JSON格式

 \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
 $items = $query->all();
 return ['data' => $items];
或者用php编码

$my_json = json_encode($items);

echo $my_json;

您可以将响应设置为JSON格式

 \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
 $items = $query->all();
 return ['data' => $items];
或者用php编码

$my_json = json_encode($items);

echo $my_json;
在联接上使用,并使用以数组形式返回数据:

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

在联接上使用,并使用以数组形式返回数据:

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


您只需使用asArray()

示例:

$users = User::find()->with('role')->asArray()->all();

您只需使用asArray()

示例:

$users = User::find()->with('role')->asArray()->all();

您可以将结果接收到数组中,并返回与@topher相同的结果。 或者你可以在今天结束

ArrayHelper::toArray(User::find()->with('role')->all()[
//或者您的名称空间模型
'common\models\User'=>ArrayHelper::merge(
User::attributes(),
['role'=>函数($model){
返回$model->role;
}]
)
])

使用此方法,您有机会设置返回结果

ArrayHelper::toArray(User::find()->all()[
//或者您的名称空间模型
“通用\模型\用户”=>[
“id”,
“用户名”
], 
])


发生这种情况是因为响应准备使用rest,并且它只使用模型中的一层。

您可以将结果接收到数组,并返回与@topher相同的结果。 或者你可以在今天结束

ArrayHelper::toArray(User::find()->with('role')->all()[
//或者您的名称空间模型
'common\models\User'=>ArrayHelper::merge(
User::attributes(),
['role'=>函数($model){
返回$model->role;
}]
)
])

使用此方法,您有机会设置返回结果

ArrayHelper::toArray(User::find()->all()[
//或者您的名称空间模型
“通用\模型\用户”=>[
“id”,
“用户名”
], 
])


发生这种情况是因为响应准备使用rest,并且它只使用模型中的一个层。

这些对您有用吗?不,角色仍然未显示。我已经用字段部分更新了问题,但仍然失败。是否为您完成了这些工作?否角色仍然未显示我已用字段部分更新了问题,但仍然失败无错误,但wron结果-相关部分中的属性未传递给jsonoutput@scaisEdge
\u相关的
是私有财产,所以你不能像那样访问它。#yupik我该如何访问它呢?没有错误,但是wron结果-与#u相关的部分中的属性没有被传递到jsonoutput@scaisEdge
\u related
是私有财产,所以你不能那样访问它。#yupik那我怎么访问它呢