Laravel模型关联问题:无法获取CartMoviment及关联Vehicle数据
修复Laravel模型关联问题
1. 修正Moviment模型的关联关系
Moviment与CartMoviment是**一对多(或一对一)**关系,而非多对多,将错误的belongsToMany关联改为对应类型:
class Moviment extends Model { // ... 其他原有代码 public function cartMoviment() { // 若一个Moviment对应一个CartMoviment,使用hasOne return $this->hasOne(CartMoviment::class); // 若一个Moviment对应多个CartMoviment,替换为hasMany // return $this->hasMany(CartMoviment::class); } }
2. 修正CartMoviment模型的关联方法命名
Laravel Eloquent依赖小写方法名识别外键(默认规则:方法名+_id,即moviment_id),将大写开头的方法名改为小写:
class CartMoviment extends Model { // ... 其他原有代码 public function moviment() { return $this->belongsTo(Moviment::class); } public function vehicle() { return $this->belongsTo(Vehicle::class, 'vehicle_cart_id'); } }
3. 修正Store方法的CartMoviment数据来源
使用专属的$requestCart验证数据创建关联记录,而非复用Moviment的请求数据:
public function store(StoreMovimentRequest $request, StoreCartMovimentRequest $requestCart, StoreDocumentRequest $requestDocument) { $this->authorize('create', Moviment::class); $moviment = Moviment::create($request->validated()); // 改为使用CartMoviment专属请求的验证数据 $moviment->cartMoviment()->create($requestCart->validated()); foreach(array($request['key_number']) as $notasFiscais) { foreach($notasFiscais as $notas) { $moviment->document()->create($notas); } } // 预加载关联数据,避免N+1查询问题 return new MovimentResource($moviment->load('cartMoviment.vehicle')); }
4. 优化资源类,确保关联数据正确返回
在资源类中明确处理关联数据,若需要嵌套返回Vehicle,可创建对应子资源:
class MovimentResource extends JsonResource { public function toArray($request) { return [ // ... 其他原有字段 // 若为hasOne关系,用单个资源实例;hasMany则用集合 'cart_moviment' => CartMovimentResource::make($this->cartMoviment), ]; } } // 新建CartMovimentResource.php class CartMovimentResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'type' => $this->type, // 嵌套返回关联的Vehicle数据 'vehicle' => VehicleResource::make($this->vehicle), // ... 其他CartMoviment字段 ]; } }
验证数据库外键
确保cart_moviments表存在moviment_id外键(关联moviments.id),且vehicle_cart_id外键正确关联vehicles.id。
内容的提问来源于stack exchange,提问作者jean.silva
相关产品推荐
相关产品推荐

