2015-01-24 5 views
-1

У меня возникли проблемы с возвратом реляционных данных API Yii2 RESTful. У меня это работает при просмотре через интерфейс, но я пытаюсь получить те же данные через API, и он не работает одинаково.Yii2 RESTful реляционные данные

Столы
country - PK является population_id
population - внешний ключ country.population_id

Я получаю эту ошибку:

{ "success": false, "data": { "name": "Invalid Configuration", "message": "The \"query\" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.", "code": 0, "type": "yii\base\InvalidConfigException", "file": "C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\data\ActiveDataProvider.php", "line": 100, "stack-trace": [ "#0 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\data\BaseDataProvider.php(79): yii\data\ActiveDataProvider->prepareModels()", "#1 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\data\BaseDataProvider.php(92): yii\data\BaseDataProvider->prepare()", "#2 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\rest\Serializer.php(162): yii\data\BaseDataProvider->getModels()", "#3 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\rest\Serializer.php(131): yii\rest\Serializer->serializeDataProvider(Object(yii\data\ActiveDataProvider))", "#4 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\rest\Controller.php(97): yii\rest\Serializer->serialize(Object(yii\data\ActiveDataProvider))", "#5 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\rest\Controller.php(75): yii\rest\Controller->serializeData(Object(yii\data\ActiveDataProvider))", "#6 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\base\Controller.php(153): yii\rest\Controller->afterAction(Object(yii\base\InlineAction), Object(yii\data\ActiveDataProvider))", "#7 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\base\Module.php(455): yii\base\Controller->runAction('index', Array)", "#8 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\web\Application.php(83): yii\base\Module->runAction('v1/country/inde...', Array)", "#9 C:\xampp\htdocs\AdvancedAPI\vendor\yiisoft\yii2\base\Application.php(375): yii\web\Application->handleRequest(Object(yii\web\Request))", "#10 C:\xampp\htdocs\AdvancedAPI\api\web\index.php(17): yii\base\Application->run()", "#11 {main}" ] } }

модель (Country.php):

<?php 
namespace api\modules\v1\models; 
use \yii\db\ActiveRecord; 

class Country extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'country'; 
    } 


    public function getCountries() 
    { 
     //return $this->hasMany(Population::className(), ['population_id' => 'population_id']); 
     return $this->hasMany(Country::className(), ['population_id' => 'population_id']); 
    } 


     public function getPopulationNumber() 
    { 
     //return $this->hasOne(Country::className(), ['population_id' => 'population_id']); 
     return $this->hasOne(Population::className(), ['population_id' => 'population_id']); 
    } 
} 

модель (Population.php):

<?php 
namespace api\modules\v1\models; 
use \yii\db\ActiveRecord; 

class Population extends ActiveRecord 
{ 
    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'population'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public static function primaryKey() 
    { 
     return ['p_id']; 
    } 

} 

контроллер (CountryController.php):

<?php 

namespace api\modules\v1\controllers; 

use yii\rest\Controller; 
use yii\data\ActiveDataProvider; 
use api\modules\v1\models\Country; 

class CountryController extends Controller 
{ 

    public function actionIndex() 
    { 
     $query = Country::find()->with('countries', 'populationNumber')->all(); 
     //$query = Country::find(); 

     return new ActiveDataProvider([ 
      'query' => $query, 
     ]); 
    } 

} 

ответ

1

Вы должны удалить all() часть из вашего запроса. Поэтому код должен быть указан:

<?php 
namespace api\modules\v1\controllers; 

use yii\rest\Controller; 
use yii\data\ActiveDataProvider; 
use api\modules\v1\models\Country; 

class CountryController extends Controller 
{ 
    public function actionIndex() 
    { 
     $query = Country::find()->with('countries', 'populationNumber'); 
     //$query = Country::find(); 

     return new ActiveDataProvider([ 
      'query' => $query, 
     ]); 
    } 
} 
+0

ОК, так что дает мне результаты, но как мне теперь получить доступ к «population_number»? делает 'var_dump (новый ActiveDataProvider ([ 'запроса' => $ запрос, ]));' результаты: '... общественное 'modelClass' => строка«апи \ модули \ v1 \ модели \ Страна '(длина = 29) public' with '=> array (size = 2) 0 => string' countries '(length = 9) 1 => string' populationNumber '(length = 16) public 'asArray' => null public 'multiple' => null ' – user616

Смежные вопросы