提问者:小点点

Eloquent自动选择不需要的列在急切加载模型关系


我正在将一个内部API从超文本标记语言(后端)处理转换为客户端的JSON(使用Knockout.js)处理,以加载一堆实体(在我的例子中是车辆)。

问题是我们的数据库存储敏感信息,这些信息不能在应用编程接口中显示,因为有人可以简单地对请求进行逆向工程并收集它们。

因此,我试图选择专门为每个关系渴望加载列我希望在API中发布,但是我有问题在加载模型关系,因为它似乎像雄辩自动加载父模型的每一列每当关系模型是渴望加载。

我知道这听起来像是在胡说八道,所以我会尽量做到更全面。

我们的数据库存储了许多合同,每个合同都分配了车辆

一个合同分配了一个User

一个车辆已经分配了许多照片。

下面是当前的代码结构:

class Contract
{
    public function user()
    {
        return $this->belongsTo('User');
    }

    public function vehicle()
    {
        return $this->belongsTo('Vehicle');
    }
}

class Vehicle
{
    public function photos()
    {
        return $this->hasMany('Photo', 'vehicle_id');
    }
}

class Photo
{
    [...]
}

由于我需要加载上面列出的每个关系,并为每个关系加载特定数量的列,因此我需要执行以下操作:

[...]

$query = Contract::join('vehicles as vehicle', 'vehicle.id', '=', 'contract.vehicle_id')->select([
    'contract.id',
    'contract.price_current',
    'contract.vehicle_id',
    'contract.user_id',
    'contract.office_id'
]);

[...]

$query = $query->with(['vehicle' => function ($query) {
    $query->select([
        'id',
        'trademark',
        'model',
        'registration',
        'fuel',
        'kilometers',
        'horsepower',
        'cc',
        'owners_amount',
        'date_last_revision',
        'date_bollo_expiration',
        'bollo_price',
        'kilometers_last_tagliando'
    ]);
}]);

$query = $query->with(['vehicle.photos' => function ($query) {
    $query->select([
        'id',
        'vehicle_id',
        'order',
        'paths'
    ])->where('order', '<=', 0);
}]);

$query = $query->with(['user' => function ($query) {
    $query->select([
        'id',
        'firstname',
        'lastname',
        'phone'
    ]);
}]);

$query = $query->with(['office' => function ($query) {
    $query->select([
        'id',
        'name'
    ]);
}]);

[...]

return $this->response->json([
    'error'           => false,
    'vehicles'        => $vehicles->getItems(),
    'pagination'      => [
        'currentPage' => (integer) $vehicles->getCurrentPage(),
        'lastPage'    => (integer) $vehicles->getLastPage(),
        'perPage'     => (integer) $vehicles->getPerPage(),
        'total'       => (integer) $vehicles->getTotal(),
        'from'        => (integer) $vehicles->getFrom(),
        'to'          => (integer) $vehicles->getTo(),
        'count'       => (integer) $vehicles->count()
    ],
    'banner'          => rand(0, 2),
    'filters'         => (count($input) > 4),
    'filtersHelpText' => generateSearchString($input)
]);

问题是:如果我不急于装载车辆。照片关系,列已正确加载。否则,将加载车辆型号的每一列。

这里有一些图片,你可以理解:

注意:一些信息已从图片中删除,因为它们是敏感信息。


共1个答案

匿名用户

您可以在模型上设置hidden属性,该属性是要隐藏以防输出的列名数组。

protected $hidden = ['password'];