【问题标题】:Laravel subquery other tableLaravel 子查询其他表
【发布时间】:2023-01-12 09:23:06
【问题描述】:

如何从另一个表中获取数据?

// ServiceComplexController
public function index(Store $store): JsonResponse
{
    /* @var User $user */
    $user = auth()->user();
    $this->listQuery = $user->store->serviceComplexes()->getQuery();
    return response()->json([
        'data' => StoreServiceComplexResource::collection($this->listQuery->get()),
    ]);
}

// StoreServiceComplexResource
public function toArray($request): array
{
    return [
        'id' => $this->id,
        'name' => $this->name,
        'description' => $this->description,
        'base_service_ids' => $this->base_service_ids,
        'more_service_ids' => $this->more_service_ids,
    ];
}

// Dump $this->listQuery->get()
array (
  0 => 
  array (
    'id' => 3,
    'name' => 'Complex 1',
    'description' => 'Desc complex 1',
    'base_service_ids' => 
    array (
      0 => 1,
      1 => 2,
    ),
    'more_service_ids' => 
    array (
      0 => 10,
    ),
  ),
)  

如何根据字段“base_service_ids”和“more_service_ids”从另一个表(服务)获取基本服务并将它们添加到响应中?

是否也可以通过 Collection Resource 提供这些数据?例如

// StoreServiceComplexResource
public function toArray($request): array
{
    return [
        ...
        'service' => [] //StoreServiceResource::collection() ....
        ...
    ];
}

【问题讨论】:

    标签: laravel eloquent laravel-8


    【解决方案1】:

    您可以使用 Eloquent with 方法从 services 表中预先加载相关数据。

    ServiceComplexControllerindex方法中,可以在查询中添加with方法,指定要加载的相关服务。

     public function index(Store $store): JsonResponse
    {
        /* @var User $user */
        $user = auth()->user();
        $this->listQuery = $user->store->serviceComplexes()->with(['baseServices', 'moreServices'])->getQuery();
        return response()->json([
            'data' => StoreServiceComplexResource::collection($this->listQuery->get()),
        ]);
    }
    
    
    

    为此,您需要在您的StoreServiceComplex 模型上定义关系。

    
    class StoreServiceComplex extends Model
    {
        public function baseServices()
        {
            return $this->hasMany(Service::class, 'id', 'base_service_ids');
        }
        public function moreServices()
        {
            return $this->hasMany(Service::class, 'id', 'more_service_ids');
        }
    }
    
    
    

    然后在StoreServiceComplexResource中,您可以将这些关系作为数组访问并将它们传递给资源

    
    public function toArray($request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->description,
            'base_services' => StoreServiceResource::collection($this->baseServices),
            'more_services' => StoreServiceResource::collection($this->moreServices),
        ];
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-15
      • 2021-06-16
      • 1970-01-01
      • 2019-04-18
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多