假设我们有Product
这样的模型:
class Product extends Model
{
protected $appends = ['picture'];
public function getPictureAttribute()
{
$picture = NULL;
if (!$this->images->isEmpty()) {
$picture = $this->images->where('selected', TRUE)->first()->path;
}
return $picture;
}
public function images()
{
return $this->morphMany(Image::class, 'imageable');
}
}
另一方面,有Image
这样的模型:
class Image extends Model
{
protected $fillable = ['title', 'path', 'imageable_id', 'imageable_type', 'selected'];
public function imageable()
{
return $this->morphTo();
}
}
正如您所看到的,每个产品可以包含许多图片。其中一个图片可以选择作为默认设置,现在我想要获取Product
,其中包含picture
字段,其中包含所选图片的path
。为此,我将picture
属性作为访问者附加到Product
模型。
但每次我在show
控制器方法中调用特定产品时都会这样:
public function show(Product $product)
{
return $product;
}
结果是这样的(自动包含images
属性):
{
"product_id": 1,
"code": null,
"created_at": "2017-12-11 12:21:49",
"updated_at": "2018-01-23 09:38:38",
"deleted_at": null,
"picture": "path 2",
"images": [
{
"id": 9,
"title": "salam",
"path": "path 1",
"imageable_id": 1,
"imageable_type": "Modules\\Product\\Entities\\Product",
"selected": 0,
"created_at": "2018-01-23 09:38:38",
"updated_at": "2018-01-23 09:38:38"
},
{
"id": 10,
"title": "in the name of god",
"path": "path 2",
"imageable_id": 1,
"imageable_type": "Modules\\Product\\Entities\\Product",
"selected": 1,
"created_at": "2018-01-23 09:38:38",
"updated_at": "2018-01-23 09:38:38"
}
],
"title": "Updataed Title"
}
我不知道什么是问题,我该如何解决。
答案 0 :(得分:2)
您可以使用unset() -
public function getPictureAttribute()
{
$picture = NULL;
if (!$this->images->isEmpty()) {
$picture = $this->images->where('selected', TRUE)->first()->path;
}
unset($this->images);
return $picture;
}
unset
你的key
返回之前。
答案 1 :(得分:1)
显示图像关系的原因是因为它是图片属性的一部分,一旦你在图片访问器中检索它。
我认为其中一个更好的做法是使用控制api响应中显示的数据的变换器。 League fractal提供此类功能。变压器的作用是过滤输出;很像外向中间件。变形金刚还提供includes的能力,允许您仅在特别要求时显示特定数据。