Laravel - 不必要的列仍然加载了select语句

时间:2015-02-22 17:42:35

标签: php laravel laravel-4 eloquent

我想限制控制器函数的结果,只将某些列传递给视图。

这是必要的,因为它将在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_idcoordinate_idcriteria

但是在下面的函数中,我使用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表数据,该数据与警报有关?

非常感谢您的帮助。

1 个答案:

答案 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');