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


Laravel - Unnecessary columns still being loaded with select statement

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

这是必要的,因为它将在API中使用,所以我需要尽可能简化结果。

我用以下功能成功地做到了这一点:

public function getIndex()
    {
        $alerts = Criteria::select('id', 'user_id', 'coordinate_id', 'alert_name')
        ->with(['coordinate' => function($q){
            $q->select('name', 'id');
        }])
        ->get();
    }

因此它只返回criteria表中的iduser_idcoordinate_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');