Yii2 RESTful relational data

天涯浪子 提交于 2019-12-14 04:23:33

问题


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. 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}" ] } }

model (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']);
    }
}

model (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'];
    }

}

controller (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:


You need to remove all() part from your query. So the code should be:

<?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,
        ]);
    }
}


来源:https://stackoverflow.com/questions/28122559/yii2-restful-relational-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!