2017-01-26 2 views
0

возвращаю данные для отдыха апи и я хотел бы вернуть оба приписывает соответствующие атрибутыПередача соответствующих атрибутов в yii2 к выходу JSon

Это то, что я есть

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

Когда я выполнять

var_dump($query->all()) 

Я получаю массив вида (атрибуты и связанные с ними атрибуты)

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

["_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) 

    } 

    } 
} 

} ...

При прохождении результат на выходе JSon через

return ['data' => $query->all()]; 

только атрибуты передаются, но связанный с ним не прошли То есть я получаю

"data": [ 
{ 
    "username": "admin", 
    "email": "[email protected]", 

}, 
{ 
    //also id 
    "username": "marshal1", 
    "email": "[email protected]", 
    ..... 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 
+0

ли какие-либо из этих работ для вас? http://stackoverflow.com/questions/30363574/how-to-display-relation-data-into-json-format-from-two-table-in-yii2-restful-api – Ripper

+0

Нет роли еще не отображается –

+0

Ive обновил вопрос с помощью части поля, но все еще не удалось –

ответ

0

Вы можете установить ответ я 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; 
+0

По-прежнему не отображаются связанные элементы –

+0

у вас есть и сообщение об ошибке или это неправильный результат? – scaisEdge

+0

Нет ошибки, но результат wron приводит к тому, что атрибуты в _related part arent передаются на json-выход –

1

eager loading Использование на объединение и использование asArray() возвращать данные в виде массива:

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

или

$query = User::find()->joinWith('role', true)->asArray(); 
Смежные вопросы