创建嵌套的API

时间:2019-06-20 13:04:53

标签: php json laravel

我正在尝试制作一个具有列表的api,并且每个列表中都有一个称为cards的花药列表,cards列表就是该列表的卡。

我试图在索引函数中显示它,但是却不起作用,就像这样:

  public function index()
  { 
   // $list = List -> cards();
    $list = List::cards();

    return response( $list );
  }

卡型号:

  public function list()
   {
        return $this->belongsTo( List::class() );
   }

卡型号:

  public function cards()
   {
        return $this->hasMany( Card::class() );
   }

我要输出的是这样的json数据:

  "lists":[
           'name':listname

             'cards':[
                       'card one': card name,
                     ]
           ]

3 个答案:

答案 0 :(得分:1)

如果使用Laravel框架,请使用Resource进行响应,您可以在laravel的Resource中加载卡。例如在ListController中:

public function index()
{
    return ListResource::collection(List::all()->paginate());
}

在ListResource中:

public function toArray($request)
{
    'cards' => CardResource::collection('cards');
}

答案 1 :(得分:0)

belongsTohasMany接受模型名称作为第一个参数。在您的情况下,您需要在关系方法中传递模型类名称。

public function list()
{
    return $this->belongsTo(List::class);
}

public function cards()
{
    return $this->hasMany(Card::class);
}

因此,如果要接收包含关系的模型,可以使用with方法。

return response(List::query()->with('cards'));

答案 2 :(得分:0)

您可以使用resources

Http \ Resources \ List:

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class List extends JsonResource
{
    public function toArray($request)
    {
        $cards = [];
        foreach ($this->cards as $card) {
            $cards[] = $card->name;
        }

        return [
            'name' => $this->name,
            'cards' => $cards,
        ];
    }
}

Http \ Controllers \ ListController:

namespacce App\Http\Controllers;

use App\Http\Resources\List as ListResource;
use App\Components\List;

class ListController extends Controller
{
    $lists = List::query()->get();

    return ListResource::collection($lists)->response();
}