1

这是我第一次在这里发帖,请原谅我的错误:

我有一个搜索功能,其路线是:

Route::get('/search', 'SearchController@index');

目前,我有一个雄辩的关系,产品有很多交易。是否可以执行以下操作返回单级深度数组:

  • 如果产品有有效交易,则仅返回交易;
  • 否则,退回产品本身。

这是我之前在我的 Product.php 中实现的:

public function deals()
    {
        return $this->hasMany(Deal::class, 'product_id');
    }

交易.php

public function product()
    {
        return $this->hasOne(Product::class, 'id', 'product_id');
    }

搜索控制器:

public function index(Request $request)
        {
            $per_page = $request->per_page ?? 10;

            $products = Product::query()->latest()
            ->when($request->query('filter'), function ($query) use ($request) {
                $query->with('deals')->where('title', 'LIKE', "%$request->filter%");
            })
            ->when($request->query('category'), function ($query) use ($request) {
                $query->with('deals')->whereHas('categories', function ($q) use ($request) {
                    $q->where('title', 'LIKE', "%$request->category%");
                });
            })
            ->paginate($per_page);
            
            return new PaginatedCollection($products, ProductResource::class);
        }

在我的 ProductResource 中:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    public function toArray($request)
    {
        $details = array_filter($this->details ?: [], function ($d) {
            return $d != "";
        });

        $personalizedOptions = array_filter($this->personalized_options ?: [], function ($o) {
            return $o != "";
        });

        return [
            'id'                    => $this->id,
            'createdAt'             => $this->created_at,
            'updatedAt'             => $this->updated_at,
            'title'                 => $this->title,
            'sellerId'              => $this->sellerId,
            'description'           => $this->description,
            'categories'            => CategoryResource::collection($this->categories),
            'details'               => $details,
            'active'                => (bool) $this->active,
            'defaultPreviewImageId' => $this->default_preview_image_id,
            'originalPrice'         => $this->originalPrice,
            'shippingPrice'         => $this->shippingPrice,
            'shippingWeightLbs'     => $this->shippingWeightLbs,
            'shippingWeightOz'      => $this->shippingWeightOz,
            'shippingMaxDays'       => $this->shipping_max_days,
            'shippingMinDays'       => $this->shipping_min_days,
            'personalized'          => (bool) $this->personalized,
            'personalizedOptions'   => $personalizedOptions,
            'deals'                 => $this->deals ?? null,
            'options'               => ProductOptionResource::collection($this->productOptions),
            'images'                => ImageResource::collection($this->images->whereNull('meta')),
            'preview'               => new ImageResource($this->images->where('meta', '=', 'preview')->first()),
        ];
    }
}

现在,我已将 ProductResource 重构为此,但它都返回null响应

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    public function toArray($request)
    {
        $details = array_filter($this->details ?: [], function ($d) {
            return $d != "";
        });

        $personalizedOptions = array_filter($this->personalized_options ?: [], function ($o) {
            return $o != "";
        });

        if($this->deals){
            DealResource::collection($this->deals);
        }else{
            return [
                'id'                    => $this->id,
                'createdAt'             => $this->created_at,
                'updatedAt'             => $this->updated_at,
                'title'                 => $this->title,
                'sellerId'              => $this->sellerId,
                'description'           => $this->description,
                'categories'            => CategoryResource::collection($this->categories),
                'details'               => $details,
                'active'                => (bool) $this->active,
                'defaultPreviewImageId' => $this->default_preview_image_id,
                'originalPrice'         => $this->originalPrice,
                'shippingPrice'         => $this->shippingPrice,
                'shippingWeightLbs'     => $this->shippingWeightLbs,
                'shippingWeightOz'      => $this->shippingWeightOz,
                'shippingMaxDays'       => $this->shipping_max_days,
                'shippingMinDays'       => $this->shipping_min_days,
                'personalized'          => (bool) $this->personalized,
                'personalizedOptions'   => $personalizedOptions,
                // 'deals'                 => $this->deals ?? null,
                'options'               => ProductOptionResource::collection($this->productOptions),
                'images'                => ImageResource::collection($this->images->whereNull('meta')),
                'preview'               => new ImageResource($this->images->where('meta', '=', 'preview')->first()),
            ];
        }
    }
}
4

1 回答 1

2

由于条件检查,它可能给出空结果的原因。它正在返回一个数组,您需要将其更新为此。

        if(count($this->deals))

这将检查交易数组是否包含数组中的元素。如果不是,它将退回产品。

于 2021-07-23T01:28:36.713 回答