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

时间:2015-09-17 16:24:48

标签: php laravel laravel-4 eloquent

我正在将内部API从HTML(后端)处理转换为客户端的JSON(使用Knockout.js)处理,以加载一堆实体(在我的情况下是车辆)。

事情是我们的数据库存储了API中无法显示的敏感信息,因为有人可以简单地对请求进行反向工程并收集它们。

因此我试图专门为每个关系选择我希望在API中发布的列,但是我在加载模型关系时遇到问题,因为看起来Eloquent会自动加载父模型的每一列关系模型急切加载。

我知道,听起来像是一个精神恍惚,所以我会尝试更全面。

我们的数据库存储了许多Contract,每个Vehicle都分配了Contract

User已分配Vehicle

Photo分配了多个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)
]);

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

vehicle.photos

问题是:如果我不急切加载Vehicle关系,则会正确加载列。否则, printf("Pointer of i in change_pointer after i = &j: %p\n", &i); // different to &j memory location it is 4 bytes after it 模型的每一列都会被加载。

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

Picture when vehicle.photos isn't eager-loaded.

Picture when vehicle.photos is eager-loaded.

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

1 个答案:

答案 0 :(得分:0)

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

protected $hidden = ['password'];