[英]How to pluck fields from a distant relationship in Laravel
我有一個多對一的關系來獲取每個產品的圖像,每個產品都應該有很多圖像以供用戶查看。 所以我嘗試在有圖片的時候拿股票
public function getImages() {
$stocks = Stocks::with('images', 'tags')->get();
return $stocks;
}
它返回這個
[
{
"id": 7,
"name": "1",
"descriptions": "1",
"price": 1,
"discount": 1,
"category": "new",
"quantity": 1,
"brand": "1",
"created_at": "2019-08-04 09:07:25",
"updated_at": "2019-08-04 09:07:25",
"images": [
{
"id": 6,
"url": "1564909645iKiw2LkoEcQIIhB4MTZJTUfwTREleWH4wEuvmRPd.png",
"created_at": "2019-08-04 09:07:25",
"updated_at": "2019-08-04 09:07:25",
"pivot": {
"stocks_id": 7,
"images_id": 6
}
},
{
"id": 7,
"url": "1564909645OVxnM0qmoQayZrP7wq82pTmSj1AwQc9gioyC5L7h.png",
"created_at": "2019-08-04 09:07:25",
"updated_at": "2019-08-04 09:07:25",
"pivot": {
"stocks_id": 7,
"images_id": 7
}
}
],
"tags": [
{
"id": 1,
"tag": "عطور",
"created_at": "2019-08-03 17:45:52",
"updated_at": "2019-08-03 17:45:52",
"pivot": {
"stocks_id": 7,
"tag_id": 1
}
}
]
}
]
但我希望“圖片”僅包含網址,例如字符串:
"images":[1.png,2.png,3.png .....]
我該怎么辦?
我的關系
public function images()
{
return $this->belongsToMany('App\Images', 'stock_images');
}
當渴望使用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;
});
您需要像這樣進行查詢:
$stocks = Stock::with(['tags','images' => function ($query) {
$query->get()->pluck('url');
}])->get();
但我希望“圖片”僅包含網址,例如字符串:
"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
請注意,上述解決方案適用於ManyToMany(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');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.