3 回答
TA贡献1846条经验 获得超7个赞
但我希望“图像”只有 url 作为字符串,例如:
"images":[1.png,2.png,3.png .....]我该怎么办?
最快的解决方案是将$visible
属性添加到您的App\Images
模型中,如下所示:
public $visible = ['url'];
这将从 json 中删除所有字段,包括pivot
字段,但visible
属性中定义的字段除外。此解决方案工作正常,但它仍然选择图像表中的所有列,如果您希望它只为关系选择最少的必填字段(以便提高性能),您可以执行以下操作:
$stocks = Stocks::with('images:url', 'tags')->get(); // this is a shortcut for selecting only url
请注意,上述解决方案适用于多对多 (N:N) 关系。但是,对于 hasMany (1:N),您还必须选择主键和所有相关的外键。
希望能帮助到你。
更新
它有效,但如何删除密钥 url: 并仅存储值 1,2,3
->pluck() 是执行此操作的集合函数,但是,您不能在不丢弃其余字段的情况下轻松地从远距离关系中提取字段,但是这个宏可以解决问题。
->pluckDistant()
在你AppServiceProvider的boot方法下,添加这个宏函数:
public function boot()
{
/**
* Shortcut to pluck a field in a relationship.
*
* @param string $relationship The relationship name
* @param string|array $value
* @param string|null $key
*/
collect()->macro('pluckDistant', function($relationship, $value, $key = null) {
return $this->map(function($item) use($relationship, $value, $key) {
$relation = $item->getRelation($relationship);
if (get_class($relation) == \Illuminate\Support\Collection::class ||
get_class($relation) == \Illuminate\Database\Eloquent\Collection::class) {
$item->setRelation($relationship, $relation->pluck($value, $key));
}
return $item;
});
});
}
然后,你这样做:
$stocks = Stocks::with('images:url', 'tags')->get()->pluckDistant('images', 'url');
TA贡献1995条经验 获得超2个赞
您需要像这样进行查询:
$stocks = Stock::with(['tags','images' => function ($query) {
$query->get()->pluck('url');
}])->get();
TA贡献1805条经验 获得超10个赞
您可以在急切加载与函数的关系时传递闭包with()。
在那个闭包中,您可以使用 select 函数来过滤列。
$stocks = Stock::with('tags')
->with(['images' => function ($query) {
$query->select(['id', 'url']);
}])
->get();
更新
如果您只想要没有键的值,则不能使用此方法。您必须在从数据库中获取数据后执行此操作。像这样..
$stocks = Stock::with('images', 'tags')->get()->map(function ($stock) {
$stock->images = $stock->images->map->url->values();
$stock->unsetRelation('images');
return $stock;
});
- 3 回答
- 0 关注
- 131 浏览
添加回答
举报