我想限制控制器函数的结果,只将某些列传递给视图。
这是必要的,因为它将在API中使用,因此我需要尽可能简化结果。
我已成功完成以下功能:
public function getIndex()
{
$alerts = Criteria::select('id', 'user_id', 'coordinate_id', 'alert_name')
->with(['coordinate' => function($q){
$q->select('name', 'id');
}])
->get();
}
因此它只会从id
表格返回user_id
,coordinate_id
和criteria
。
但是在下面的函数中,我使用has
查询(访问关系),因此,之后使用with
来限制列,但它仍然返回所有:
public function getMatches()
{
$matches = Criteria::select('id')
->has('alerts')
->with(['alerts' => function ($q){
$q->select('id', 'headline', 'price_value', 'price_type');
}])
->with('alerts.user.companies')
->get();
}
但是,例如,它仍然返回description
列,该列位于警报表中。明确进行with
查询的has
查询无法正常运行(但没有出现任何错误)。
此外,->with('alerts.user.companies')
查询返回用户表中的所有内容,这也是不必要的。如何仅返回与用户相关的companies
表数据,该数据与警报有关?
非常感谢您的帮助。
答案 0 :(得分:1)
根据您要实现的目标,您可以使用$hidden
属性隐藏您不希望以json或数组形式返回的列。
在你的Alert
模型中,你可以做到:
protected $hidden = ['description'];
这样description
字段就不会被退回。
如果它不适合您(有时您想要返回描述),您可以创建额外的关系来限制数据库中的字段。
例如,您可以创建以下关系:
public function alertsSimple() {
return $this->hasMany('Alert')->select('id', 'headline', 'price_value', 'price_type', 'criteria_id');
}
也许在您选择的问题是您根本不使用外键。您也可以尝试:
$q->select('id', 'headline', 'price_value', 'price_type','criteria_id');
而不是
$q->select('id', 'headline', 'price_value', 'price_type');