Yii2 REST API 关系数据返回

问题描述 投票:0回答:3

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

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

仍然在控制器中,例如,我可以调用如下内容:

$result->fKCountry->name

当关系正在运行时,它会显示适当的名称。到目前为止一切顺利,但是一旦我返回从 API 客户端收到的结果

return $result;
fkCountry
就消失了,我无法访问上面提到的名称。唯一剩下的就是指向国家/地区表的外键值。

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

php api rest yii2 relational-database
3个回答
6
投票

像这样设置

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

确保在您的 Person 模型中

extraFields
函数包含
fKCountry
。如果您还没有实现
extraFields
功能,请添加它:

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

然后,当您调用 url 时,请确保添加

expand
参数来告诉您要包含 fkCountry 数据的操作。所以类似:

/yourcontroller/your-action?expand=fKCountry

3
投票

我成功解决了上述问题。 使用 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
投票

使用

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:{...}

© www.soinside.com 2019 - 2024. All rights reserved.