Laravel:JSON 和数据透视表

Posted

技术标签:

【中文标题】Laravel:JSON 和数据透视表【英文标题】:Laravel: JSON and pivot table 【发布时间】:2016-10-18 02:44:55 【问题描述】:

很抱歉标题不解释,但我想不出一个描述性的标题。

我有以下 3 个表: - 游戏 - 平台 - 游戏平台

我在 Laravel 中为平台和游戏提供了 2 个模型。

public function games() 

    return $this->belongsToMany('App\Game', 'games_platforms')->withPivot('release_date');


public function platforms() 

    return $this->belongsToMany('App\Platform', 'games_platforms')->withPivot('release_date');

现在这就像一个魅力,我得到一个 JSON 字符串,其中包含 3 个表中的所有信息,就像这样。

[
    "id": 1,
    "name": "Borderlands",
    "short_description": "",
    "created_at": null,
    "updated_at": null,
    "platforms": [
        "id": 4,
        "name": "PC",
        "pivot": 
            "game_id": 1,
            "platform_id": 4,
            "release_date": "2016-03-03"
        
    ]
]

现在我的问题如下。我不想显示整个 'pivot' 信息,只显示 'release_date',如下所示:

"platforms": [
        "id": 4,
        "name": "PC",
        "release_date": "2016-03-03"

在 Laravel 中有没有简单的方法来做这样的事情?据我现在所见,查看其他帖子,要么编写一个将 json 转换为数组的函数,然后我就可以对其进行排列。或者我可以编写自己的查询,而不是让 Laravel 来做这一切。

希望你们能帮我解决这个问题。谢谢!

【问题讨论】:

我知道 Laravel 支持开箱即用的即时加载,语法非常易于理解。我从来没有在数据透视表上使用过它,但也许试试看?有人在这里做过,答案似乎有帮助:laracasts.com/discuss/channels/eloquent/… 另外这个前面的问题似乎有一个非常不错的答案:***.com/questions/21645257/… 【参考方案1】:

我会通过集合类上的方法修改查询返回的数据:

//replace Game::all() with your actual query
return Game::all()->each(function($game)
    $game->platforms->map(function($platform)
        $platform->release_date = $platform->pivot->release_date;
        unset($platform->pivot);
        return $platform;
    );
);

【讨论】:

太棒了,这就是我一直在寻找的。谢谢。 @Serellyn 很高兴我能帮上忙【参考方案2】:

我知道这已经得到解答,但我相信正确的答案是将您想要隐藏的任何内容添加到模型上的 hidden 属性中。

<?php
class Games extends Eloquent

    protected $hidden = ['pivot.game_id', 'pivot.platform_id'];

我不确定您的密钥是什么,因为它们在您的两个示例中有所不同。 请看:https://github.com/laravel/framework/issues/745

【讨论】:

【参考方案3】:

更好的方法是使用 Laravel 资源,

首先创建资源 (php artisan make:resource)

Rresource GameResource extends Resource

 public function toArray($request)
 
  return [
    'release_date' => $this->pivot->release_date,
    'name' => $this->name,
     /// All other fields or you can merge both here 
   ];
 

现在使用这个资源;

$data = GameResource::collection(Game::all());

【讨论】:

以上是关于Laravel:JSON 和数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

如何创建数据透视表 laravel?

Laravel Eloquent - 查询数据透视表

laravel 使用 in 子句模型名称连接多态数据透视表

使用 Laravel 数据透视表的多行和多列输入表单

试图在资源 Laravel 中返​​回数据透视表

Laravel 如何创建数据透视表?