首页 > 解决方案 > Laravel - 具有关系条件

问题描述

试图将“如果条件”整合到模型关系中。但它不起作用。

    $customer_index = Customer::where('firm_id', $firm_id)
    ->with(['company', 'tires', 'vehicles'])
    ->withCount(['tires', 'vehicles'])
    ->orderBy('id', 'desc');

我的 Customer.php 模型

public function vehicles()
{
    if(isset($this->company->is_fleet)){
        return $this->hasMany('App\Models\CustomerVehicle', 'fleet_id', 'company_id');
    }
    return $this->hasMany('App\Models\CustomerVehicle');
}

标签: laraveleloquent

解决方案


不能通过急切加载来做那种条件。

为了保持 eloquent 的所有好处,你应该分离关系

public function company_vehicles()
{
    return $this->hasMany(CustomerVehicle::class, 'fleet_id', 'company_id');
}

public function customer_vehicles()
{
    return $this->hasMany(CustomerVehicle::class);
}

//A scope to tuck away the eager loads
public function scopeVehicles($query)
{
   return $query->with(['company_vehicles', 'customer_vehicles']);
}

您在评论中要求将关系一键连接vehicles。这是你可以尝试的方法


User::vehicles()->get()->map(function($user){

    if(!empty($user->customer_vehicles)){
      
      $user->vehicles = $user->customer_vehicles;
      unset($user->customer_vehicles);
      unset($user->company_vehicles);
      
    } else if(!empty($user->company_vehicles)) {
      
      $user->vehicles = $user->company_vehicles;
      unset($user->customer_vehicles);
      unset($user->company_vehicles);
      
    }
  
  return $user;
});

推荐阅读