I am having some trouble getting the Yii2 RESTful API returning relational data. I have this working when viewed through the frontend but i am trying to get the same data through the API and its not working the same way.
Tables
country
- PK is population_id
population
- Foreign Key is country.population_id
I am getting this error:
{ "success": false, "data": { "name": "Invalid Configuration", "message": "The "query" property must be an instance of a class that implements the QueryInterface e.g. yiidbQuery or its subclasses.", "code": 0, "type": "yiiaseInvalidConfigException", "file": "C:xampphtdocsAdvancedAPIvendoryiisoftyii2dataActiveDataProvider.php", "line": 100, "stack-trace": [ "#0 C:xampphtdocsAdvancedAPIvendoryiisoftyii2dataBaseDataProvider.php(79): yiidataActiveDataProvider->prepareModels()", "#1 C:xampphtdocsAdvancedAPIvendoryiisoftyii2dataBaseDataProvider.php(92): yiidataBaseDataProvider->prepare()", "#2 C:xampphtdocsAdvancedAPIvendoryiisoftyii2 estSerializer.php(162): yiidataBaseDataProvider->getModels()", "#3 C:xampphtdocsAdvancedAPIvendoryiisoftyii2 estSerializer.php(131): yii estSerializer->serializeDataProvider(Object(yiidataActiveDataProvider))", "#4 C:xampphtdocsAdvancedAPIvendoryiisoftyii2 estController.php(97): yii estSerializer->serialize(Object(yiidataActiveDataProvider))", "#5 C:xampphtdocsAdvancedAPIvendoryiisoftyii2 estController.php(75): yii estController->serializeData(Object(yiidataActiveDataProvider))", "#6 C:xampphtdocsAdvancedAPIvendoryiisoftyii2aseController.php(153): yii estController->afterAction(Object(yiiaseInlineAction), Object(yiidataActiveDataProvider))", "#7 C:xampphtdocsAdvancedAPIvendoryiisoftyii2aseModule.php(455): yiiaseController->runAction('index', Array)", "#8 C:xampphtdocsAdvancedAPIvendoryiisoftyii2webApplication.php(83): yiiaseModule->runAction('v1/country/inde...', Array)", "#9 C:xampphtdocsAdvancedAPIvendoryiisoftyii2aseApplication.php(375): yiiwebApplication->handleRequest(Object(yiiwebRequest))", "#10 C:xampphtdocsAdvancedAPIapiwebindex.php(17): yiiaseApplication->run()", "#11 {main}" ] } }
model (Country.php):
<?php
namespace apimodulesv1models;
use yiidbActiveRecord;
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']);
}
}
model (Population.php):
<?php
namespace apimodulesv1models;
use yiidbActiveRecord;
class Population extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'population';
}
/**
* @inheritdoc
*/
public static function primaryKey()
{
return ['p_id'];
}
}
controller (CountryController.php):
<?php
namespace apimodulesv1controllers;
use yii
estController;
use yiidataActiveDataProvider;
use apimodulesv1modelsCountry;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find()->with('countries', 'populationNumber')->all();
//$query = Country::find();
return new ActiveDataProvider([
'query' => $query,
]);
}
}
See Question&Answers more detail:os