簡體   English   中英

如何從Laravel中的遠距離關系中挑選田野

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM