【问题标题】:JSON returns excessive informationJSON 返回过多信息
【发布时间】:2019-07-21 19:02:07
【问题描述】:

我正在使用 Laravel。

我不知道如何解释得很好......问题是我试图从我的数据库中获取一些值。

路线:

Route::post('inbox/all', 'InboxController@message_type_1');

我的控制器:

public function message_type_1(Request $request)
{
  $user_id =  Auth::user()->id;
  $result =   Messages::where('receiver_id', $user_id)->with('sender')->with(['bookings' => function($query) {
    $query->with('currency');
  }])->with('object_address')->orderBy('id','desc');

  $result =  $result->paginate(10)->toJson();
  return $result;
}

返回给了我很多信息,有些我不想知道

这是回复:

{
  "current_page": 1,
  "data": [{
    "id": 2,
    "object_id": 3,
    "booking_id": 1,
    "sender_id": 1,
    "receiver_id": 2,
    "message": "It is accepted",
    "type_id": 5,
    "read": 1,
    "archive": 0,
    "star": 0,
    "created_at": "2019-02-26 11:45:28",
    "updated_at": "2019-02-26 12:15:11",
    "created_time": "26\/02\/2019",
    "host_user": 0,
    "guest_user": 1,
    "sender": {
      "id": 1,
      "first_name": "Joe",
      "last_name": "Cos",
      "email": "email-91@hotmail.com",
      "profile_image": null,
      "balance": 0,
      "status": "Active",
      "created_at": "2019-02-21 15:19:26",
      "updated_at": "2019-02-21 15:19:26",
      "profile_src": "http:\/\/xxx.com\/public\/images\/user_pic-225x225.png"
    },
    "bookings": {
      "id": 1,
      "object_id": 3,
      "code": "mYuL4p",
      "host_id": 1,
      "user_id": 2,
      "start_date": "2019-02-26",
      "end_date": "2019-02-27",
      "status": "Accepted",
      "guest": 0,
      "total_night": 1,
      "per_night": 20,
      "base_price": 20,
      "cleaning_charge": 0,
      "guest_charge": 0,
      "service_charge": 0,
      "security_money": 0,
      "host_fee": 0,
      "total": 20,
      "booking_type": "request",
      "currency_code": "EUR",
      "cancellation": "Flexible",
      "transaction_id": "67427302T32774838",
      "payment_method_id": 1,
      "accepted_at": "2019-02-26 11:45:28",
      "expired_at": null,
      "declined_at": null,
      "cancelled_at": null,
      "cancelled_by": null,
      "created_at": "2019-02-26 11:37:36",
      "updated_at": "2019-02-26 11:45:28",
      "host_payout": 23,
      "label_color": "success",
      "date_range": "Feb 26 - 27, 2019",
      "expiration_time": "2019\/02\/27 11:37:36",
      "currency": {
        "id": 3,
        "name": "Europe",
        "code": "EUR",
        "symbol": "€",
        "rate": "0.88",
        "status": "Active",
        "default": "0",
        "org_symbol": "€"
      }
    },
    "object_address": {
      "id": 3,
      "object_id": 3,
      "address_line_1": "XXXXXXXXX, 4050-352 Porto, Portugal",
      "address_line_2": null,
      "latitude": "49.999",
      "longitude": "-8.88810419921",
      "city": "P",
      "state": "P",
      "country": "P",
      "postal_code": "4050-352"
    }
  }],
  "from": 1,
  "last_page": 1,
  "next_page_url": null,
  "per_page": 10,
  "prev_page_url": null,
  "to": 1,
  "total": 1
}

为什么我会得到这么多信息?如何控制这种疯狂?

【问题讨论】:

  • 为了帮助理解您的问题,您还应该说明您希望看到的信息。此外,它拼写为 JSON(不是 JASON)。
  • 你没有过滤它。我认为有一个 PHP 函数。

标签: php json database laravel


【解决方案1】:

Laravel 有一种方法可以从 JSON 中“隐藏”不同的属性

https://laravel.com/docs/5.7/eloquent-serialization#hiding-attributes-from-json

在应用程序中的每个模型上,您可以指定 $hidden 属性以及要对 JSON 对象隐藏的属性数组。

所以对于你的例子,你可以在你的模型中做这样的事情

<?php
...
class Messages extends Model
{
    protected $hidden = [
        "object_id",
        "booking_id",
        "sender_id",
        "receiver_id",
        // add more columns you wish to hide
    ]; 
}

另外,还有一个相反的 $visible 属性,即您只定义应该在 JSON 对象中可见的字段

<?php
...
class Messages extends Model
{
    protected $visible = [
        "id",
        "name",
        // add more columns you wish to show
    ]; 
}

【讨论】:

  • 你用的是什么版本的 laravel ?还有一个替代方法,使用protected $visible = [...],它的工作方式相反 - 在这里你应该只列出你真正想要显示的属性
  • 版本为5.4.36
  • 我更新了原始答案,我也会尝试可见的替代方案。这应该是特定于您的 laravel 版本的文档链接 laravel.com/docs/5.4/…
  • 我将尝试解释我的代码执行 2 级查询 1 获取消息 id 和用户 id,之后 2 级查询获取所有用户信息!我不知道为什么当我只需要名字时我会得到所有的用户信息(例如)!在用户模型中,如果我使用受保护的 $hidden['email'] 它可以工作!但是现在我遇到了一个问题,因为它可以工作并且可以执行我想要的操作,但是另一方面,我在其他页面中也有需要该信息的 json 代码,并且受保护的 $hidden 会阻止该信息!
  • 在这种情况下(如果您需要在不同地方具有不同属性的相同模型),最好使用昨天建议的解决方案@apokryfos - 使用 Laravel Resources laravel.com/docs/5.7/eloquent-resources 您也许可以实现在调用期间隐藏和显示属性的结果相同,但资源是专门为您需要的目的而制作的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多