【问题标题】:Array with single attribute of many-to-many Eloquent relationship具有多对多 Eloquent 关系的单个属性的数组
【发布时间】:2019-02-12 14:21:52
【问题描述】:

我创建了一个模型NearMiss,它与Type 模型具有多对多关系。当有针对特定 NearMiss 的 GET 请求时,我希望将一个数组附加到 JSON 输出,该数组具有属于 NearMiss 实例的所有 Type 实例的 name 属性。

我可以将一个类型数组附加到输出,但我想去掉所有附加信息(例如枢轴信息)。

GET请求/nearmisses/{nearmiss}执行如下方法:

public function show($id) 
    {
        try {
            $nearmiss = NearMiss::findOrFail($id)->first();
            $nearmiss->types->makeHidden(['id', 'created_at', 'updated_at']);
            return response()->json($nearmiss);
        } catch(ModelNotFoundException $e) {
            abort(400, 'Model not found');
        }
    }

NearMiss 模型具有以下类型关系:

public function types() 
    {
        return $this->belongsToMany('App\Type', 'near_miss_type', 'near_miss_id', 'type_id');
    }

当前输出:

{
    "id": 1,
    "location_long": "0.0000000",
    "location_lat": "0.0000000",
    "employee_id": 1,
    "created_at": "2019-02-11 16:38:24",
    "updated_at": "2019-02-11 16:38:24",
    "types": [
        {
            "id": 1,
            "name": "Brandgevaar"
            "created_at": "2019-02-11 16:33:25",
            "updated_at": "2019-02-11 16:33:25",
        },
        {
            "id": 2,
            "name": "Slipgevaar",
            "created_at": "2019-02-11 16:34:12",
            "updated_at": "2019-02-11 16:34:12",
        }
    ]
}

我知道我可以删除其他属性(例如 id、created_at、updated_at),但这仍然给我留下了一组 Type 实例(只有一个名称属性)。当我尝试flatten() 时,我收到一个错误,指出flatten() 不能用于 BelongsToMany 关系。

期望的输出:

{
    "id": 1,
    "location_long": "0.0000000",
    "location_lat": "0.0000000",
    "employee_id": 1,
    "created_at": "2019-02-11 16:38:24",
    "updated_at": "2019-02-11 16:38:24",
    "types": [
        "Brandgevaar", "Slipgevaar"
    ]
}

请有人帮我获得所需的输出。

【问题讨论】:

  • 您能显示您当前用于生成此输出的查询吗?
  • 我编辑了我的原始帖子!

标签: laravel eloquent


【解决方案1】:

您可以手动加载类型并使用pluck() 函数仅获取每种类型的名称。

$nearmiss->types = $nearmiss->types()->pluck('name');

但是我不确定这是否会干扰 Eloquent 的魔法属性。

【讨论】:

  • 谢谢,成功了!我已经尝试过pluck('name'),但没有手动加载类型。只调用$nearmiss->types()->pluck('name')(没有将其分配给$nearmiss->types)是行不通的。
  • 在调用函数而不赋值时,它只是加载数据,而不是将其存储在任何地方。
  • 很高兴我能帮上忙。考虑将此标记为您问题的答案,以便其他用户也可以找到它。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多