我已经使用自定义操作设置了 Yii2 REST API,一切工作正常。然而,我想做的是从 API 返回一些数据,其中包括由外键设置的数据库关系。这些关系是存在的,而且它们实际上运行正常。这是其中一个控制器中的示例查询:
$result = \app\models\Person::find()->joinWith('fKCountry', true)
->where(..some condition..)->one();
仍然在控制器中,例如,我可以调用如下内容:
$result->fKCountry->name
当关系正在运行时,它会显示适当的名称。到目前为止一切顺利,但是一旦我返回从 API 客户端收到的结果
return $result;
,fkCountry
就消失了,我无法访问上面提到的名称。唯一剩下的就是指向国家/地区表的外键值。
我可以提供更多代码和信息,但我认为这足以描述问题。如何对返回的连接数据中的信息进行编码,以便 API 客户端也可以访问它?
像这样设置
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
我成功解决了上述问题。 使用 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 就可以为我提供来自连接字段的数据。
使用
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:{...}