You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel接口开发:实现指定字段展示与product_size验证

Laravel接口问题解决方案

1. 修复seller_name无法返回的问题

确认模型关联正确性

确保Product模型中已正确定义与Seller的从属关联:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Product extends Model
{
    /**
     * 关联到所属商家
     */
    public function seller(): BelongsTo
    {
        return $this->belongsTo(Seller::class);
    }
}

修正ProductResource写法

由于seller是单个关联(belongsTo),不能使用SellerResource::collection,需改为单个资源实例或直接取值:

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'phone_name' => $this->product_name,
            'display_size' => $this->product_size,
            // 仅在预加载seller时返回,避免N+1查询
            'seller_name' => $this->whenLoaded('seller', fn() => $this->seller->seller_name)
        ];
    }
}

查询时预加载关联

控制器中必须用with('seller')预加载关联,否则whenLoaded不会触发:

$product = Product::with('seller')->findOrFail($id);

2. 实现product_size数值大于2的验证

由于product_size是字符串类型,需先验证其为有效数值,再判断大小:

推荐方案:使用FormRequest验证

创建ProductShowRequest类统一处理验证逻辑:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ProductShowRequest extends FormRequest
{
    public function authorize()
    {
        return true; // 根据业务需求调整权限控制
    }

    public function rules()
    {
        return [
            'id' => [
                'required',
                'exists:products,id',
                // 自定义验证规则:检查商品尺寸是否大于2
                function ($attribute, $value, $fail) {
                    $product = \App\Models\Product::find($value);
                    
                    if (!is_numeric($product->product_size)) {
                        $fail('商品尺寸必须为有效数值');
                    } elseif ((float)$product->product_size <= 2) {
                        $fail('商品尺寸必须大于2');
                    }
                }
            ]
        ];
    }
}

简易方案:控制器内直接验证

若无需单独Request类,可在控制器中直接处理:

$product = Product::with('seller')->findOrFail($id);

if (!is_numeric($product->product_size) || (float)$product->product_size <= 2) {
    return response()->json(['error' => '商品尺寸必须是大于2的有效数值'], 400);
}

3. 完整接口实现

路由注册(routes/api.php)

use App\Http\Controllers\ProductController;

Route::get('/product/get_data/{id}', [ProductController::class, 'get_data']);

控制器代码(ProductController.php)

namespace App\Http\Controllers;

use App\Http\Requests\ProductShowRequest;
use App\Http\Resources\ProductResource;
use App\Models\Product;

class ProductController extends Controller
{
    public function get_data(ProductShowRequest $request, $id)
    {
        $product = Product::with('seller')->findOrFail($id);
        return new ProductResource($product);
    }
}

内容的提问来源于stack exchange,提问作者Miron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:30:45