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