Yii2 REST API关系数据返回

时间:2016-06-21 10:20:21

标签: api rest yii2 relational-database

我已经使用自定义操作设置了Yii2 REST API,一切正常。但是,我尝试做的是从API返回一些数据,其中包括由外键设置的数据库关系。关系在那里,他们实际上正常工作。这是其中一个控制器中的示例查询:

$result = \app\models\Person::find()->joinWith('fKCountry', true)
      ->where(..some condition..)->one();

仍然在控制器中,我可以,例如,调用这样的东西:

$result->fKCountry->name

,当关系正常工作时,它会显示相应的名称。到目前为止一切顺利,但是一旦我返回从API客户端收到的结果return $result;fkCountry就消失了,我无法访问上面提到的名称。唯一剩下的就是指向国家/地区表的外键值。

我可以提供更多代码和信息,但我认为这足以描述问题。如何对返回的联接数据中的信息进行编码,以便API客户端也可以访问它?

3 个答案:

答案 0 :(得分:3)

像这样设置

public function actionYourAction() {
    return new ActiveDataProvider([
        'query' => Person::find()->with('fKCountry'), // and the where() part, etc.
    ]);
}

确保在您的个人模型中extraFields功能包含fKCountry。如果您还没有实现extraFields功能,请添加它:

public function extraFields() {
    return ['fKCountry'];
}

然后当您调用url时,请确保添加expand参数以告知您要包含fkCountry数据的操作。如下所示:

/yourcontroller/your-action?expand=fKCountry

答案 1 :(得分:1)

我设法解决了上述问题。 使用ActiveDataProvider,我在代码中进行了3次更改以使其正常工作。

这是控制器:

Model::find()
->leftJoin('table_to_join', 'table1.id = table_to_join.table1_id')
->select('table1.*, table_to_join.field_name as field_alias');

在模型中,我引入了一个与上述别名同名的新属性:

public $field_alias;

仍然在模型类中,我修改了fields()方法:

public function fields()
{
    $fields = array_merge(parent::fields(), ['field_alias']);
    return $fields;
}

这样我的API就可以从连接字段中提供数据。

答案 2 :(得分:0)

使用with进行快速加载

$result = \app\models\Person::find()->with('fKCountry')
      ->where(..some condition..)->all();

然后将属性'fkCountry'添加到字段数组

public function fields()
    {
        $fields= parent::fields();
        $fields[]='fkCountry';
        return $fields;
    }

因此$ result现在将返回一个person的json数组,并且每个人都将具有属性fkCountry:{...}