【问题标题】:is it possible to return different models in an API response是否可以在 API 响应中返回不同的模型
【发布时间】:2021-09-30 04:53:21
【问题描述】:

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

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

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

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

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

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

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

Deal.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()),
            ];
        }
    }
}

【问题讨论】:

    标签: eloquent laravel-7 eloquent-relationship laravel-relations laravel-resource


    【解决方案1】:

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

            if(count($this->deals))
    

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

    【讨论】:

    • 哇,非常感谢您的快速响应。应用修复格式化响应以返回交易或产品。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2018-09-26
    • 2023-03-28
    • 1970-01-01
    • 2013-12-16
    • 2013-10-26
    相关资源
    最近更新 更多