我想限制控制器函数的结果只将某些列传递到视图中。
这是必要的,因为它将在API中使用,所以我需要尽可能简化结果。
我用以下功能成功地做到了这一点:
public function getIndex()
{
$alerts = Criteria::select('id', 'user_id', 'coordinate_id', 'alert_name')
->with(['coordinate' => function($q){
$q->select('name', 'id');
}])
->get();
}
因此它只返回criteria
表中的id
、user_id
和coordinate_id
。
然而,在下面的函数中,我使用了has
查询(访问关系),因此,之后使用with
来限制列,但它仍然返回all:
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
列。进行has
查询的with
查询显然不起作用(但它没有显示任何错误)。
此外,->with('alerts.user.companies')
查询正在返回用户表中的所有内容,这也是不必要的。如何仅返回与用户相关的companies
表数据,该用户与警报相关?
非常感谢您的帮助。
根据您想要实现的目标,您可以使用$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');