如何在Api资源中将不同的关系作为同一名称返回

时间:2018-05-03 16:53:20

标签: laravel api laravel-5 laravel-5.6

在我的项目中,我建立了多种关系,如:

模型

public function foo() 
{ 
  return $this->hasMany(Bar::class);
}

public function fooSold() 
{ 
  return $this->hasMany(Bar::class)->where('sold', 1);
}

控制器

public function show()
{
  $bar = Bar::with('foo')->first();
  return new BarResource($bar);
}

public function showSold()
{
  $bar = Bar::with('fooSold')->first();
  return new BarResource($bar);
}

资源

public function toArray($request)
return [
...
'foo' => Foo::collection($this->whenLoaded('foo')),
]

在我的控制器中返回第一个函数没有任何问题。但是我如何在我的资源中以“foo”的同名返回第二个?

'foo' => Foo::collection($this->whenLoaded'fooSold')),
'foo' => Foo::collection($this->whenLoaded'foo')),

这可行,但似乎不是正确的方法,因为你有两次相同的数组键。

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

对第二种情况使用local query scope

public function scopeSold($query) 
{ 
    return $query->whereHas('foo', function ($q) { 
        $q->where('sold', 1);
    });
}

// call the scope
$sold = Foo::sold();

答案 1 :(得分:0)

数组的重点是拥有唯一键。如果要存储值对,请创建一个数组数组,如:

$array[] = [$value1, $value2];

在您的情况下,例如:

'foo' => [Foo::collection($this->whenLoaded'fooSold')), Foo::collection($this->whenLoaded'foo'))]

答案 2 :(得分:0)

尝试一下:

'foo' => Foo::collection($this->whenLoaded('foo') instanceof MissingValue ? $this->whenLoaded('fooSold') : $this->whenLoaded('foo')),