yii2restapi关系数据返回

yii2restapi关系数据返回,api,rest,yii2,relational-database,Api,Rest,Yii2,Relational Database,我已经用自定义操作设置了yii2restapi,一切正常。然而,我试图做的是从API返回一些数据,其中包括由外键设置的数据库关系。关系就在那里,它们实际上是正确的。以下是其中一个控制器中的查询示例: $result = \app\models\Person::find()->joinWith('fKCountry', true) ->where(..some condition..)->one(); 仍然在控制器中,例如,我可以调用如下内容: $result-&g

我已经用自定义操作设置了yii2restapi,一切正常。然而,我试图做的是从API返回一些数据,其中包括由外键设置的数据库关系。关系就在那里,它们实际上是正确的。以下是其中一个控制器中的查询示例:

$result = \app\models\Person::find()->joinWith('fKCountry', true)
      ->where(..some condition..)->one();
仍然在控制器中,例如,我可以调用如下内容:

$result->fKCountry->name
当关系工作时,它将显示适当的名称。到目前为止还不错,但只要我返回结果
return$result中,
fkCountry
已消失,我无法访问上述名称。唯一剩下的是指向国家表的外键的值

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

如下设置

public function actionYourAction() {
    return new ActiveDataProvider([
        'query' => Person::find()->with('fKCountry'), // and the where() part, etc.
    ]);
}
确保在您的个人模型中,
extraFields
功能包括
fKCountry
。如果尚未实现
外部字段
功能,请添加它:

public function extraFields() {
    return ['fKCountry'];
}
然后,当您调用url时,请确保添加
expand
参数,以告知要包含fkCountry数据的操作。比如:

/yourcontroller/your-action?expand=fKCountry

我设法解决了上述问题。 使用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()方法:


通过这种方式,我的API为我提供了来自连接字段的数据。

使用
进行快速加载

$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:{…}

请显示更多代码我实际上没有使用ActiveDataProvider,只是从find()函数获取结果,在本例中,这应该是无关的。我按照您的建议添加了extraFields函数,奇怪的是,只要我调用one()函数,它就可以工作。因此,如果我使用('fKCountry')->where(…)->one()进行
Person::find()->我在响应中获得额外的数组和国家信息。但是,只要我将one()更改为all(),这就是我所需要的,额外的数据就会再次消失。知道为什么会发生这种情况以及如何修复它吗?不知道如何在不添加ActiveDataProvider的情况下将其取回,但它会消失,因为在某个地方,结果会传递到
toArray()
,并且在不使用ActiveDataProvider的情况下,它看不到我认为的扩展设置。但是如果您添加了数据提供程序,它确实可以正常工作吗?是的,它可以与ActiveDataProvider一起工作,但不能没有它。好提示。尽管如此,应该有一种更简单的方法来实现这一点,但在我看来,仅仅为了产生一个结果而不延迟加载数据的代码太多了。我希望去掉URL中的get参数。尽管如此,将答案标记为正确,因为它完成了问题中所问的内容。并且仅作为记录,只要您有
?expand=…,…
GET参数,ActiveDataProvider中带有(…)
部分的
->似乎并不真正需要。在
字段()中定义的字段
方法将始终返回,因此即使没有GET参数。但是,如果您将关系放在这里,当一些代码调用Array()时,它们将始终被加载,因此您可能会在很多时候执行不必要的查询。
public function fields()
    {
        $fields= parent::fields();
        $fields[]='fkCountry';
        return $fields;
    }