【问题标题】:Laravel How to orderby()->first() in eager loadingLaravel 如何在急切加载中 orderby()->first()
【发布时间】:2021-10-01 20:42:17
【问题描述】:

我有这个查询,它工作得很好,除非我在上面调用->first() 函数,来自某些关系的数据消失了。

我想要达到的目标:

我正在尝试获取价格最低的 sp_services。 数据数组中的第一个对象(id:1)有两个 sp_service,数据数组中的第二个对象(id:13)只有一个 sp_services。当我这样做时$query->orderBy('sp_services.price', 'DESC')->first(); 第一个对象在那里,但第二个对象(id:6,名称:洗车)消失了,只有空数组。

在下面提到的 JSON 中,我只在此处显示相关数据。谁能告诉我我在这里做错了什么?为什么它不起作用。还有没有更好的方法来达到预期的效果。

查询:

$branchesQuery = SpBranch::query();
                
$branchesQuery->where('status', true);
                
$branchesQuery->when($request->filled('price'), function($query) use($request) {
    return $query->with(['service_provider' => function($query) use($request) {
        $query->whereHas('sp_services')
            ->with(['sp_services' => function($query) use($request) {
                $query->orderBy('sp_services.price', 'DESC'); //->first();
            }]);
        }]);
    });
                
$branches = $branchesQuery->paginate($perPageLimit);
                
return $branches;

型号:

class SpBranch extends Model
{
    public function service_provider()
    {
        return $this->belongsTo(ServiceProvider::class, 'sp_id');
    }
}

class ServiceProvider extends Model
{
    public function sp_services()
    {
        return $this->hasMany(SpService::class, 'sp_id', 'id');
    }
}

JSON:

{
  "data": [
    {
      "id": 1,
      "sp_id": 1,
      "name": "Branch 01",
      "status": 1,
      "service_provider": {
        "id": 1,
        "name": "Service Provider 01",
        "sp_services": [
          {
            "id": 3,
            "sp_id": 1,
            "branch_id": null,
            "name": "Service 03",
            "price": 50
          },
          {
            "id": 4,
            "sp_id": 1,
            "branch_id": null,
            "name": "Service 04",
            "price": 70
          }
        ]
      }
    },
    {
      "id": 13,
      "sp_id": 5,
      "name": "Branch 13",
      "status": 1,
      "service_provider": {
        "id": 5,
        "name": "Service Provider 05",
        "sp_services": [
          {
            "id": 6,
            "sp_id": 5,
            "branch_id": null,
            "name": "car wash",
            "price": 300
          }
        ]
      }
    }
  ]
}

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您不能按数据库上预先加载的表进行排序或分组,因为WITH 方法所做的是它会触发一个新查询,这意味着根本没有连接到第一个查询,您可以做的是您可以订购或将它们分组到集合中,这意味着在从 db 获取数据后,您可以对它们进行排序,我认为函数称为 ->sortBy(),它将按您想要的字段排序,但这会降低您的性能。如果在您的情况下性能很重要,您始终可以使用连接来连接两个表,这样您就可以直接从数据库中订购结果。

    【讨论】:

      【解决方案2】:
      class ServiceProvider extends Model
      {
          public function sp_services()
          {
              return $this->hasMany(SpService::class, 'sp_id', 'id')->orderBy('price', 'asc');
          }
      }
      

      【讨论】:

      • 它如何返回最低值?
      • 它将按价格从最低到最高排列查询中返回的值
      • 因此,如果您需要最低值,您应该从查询的返回值中获取索引零
      • 这正是我要问的问题,请阅读查询,当我这样做时 ->first() 数据消失了。我不想在查询执行后得到零值。
      猜你喜欢
      • 2018-12-11
      • 2014-12-28
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2014-08-13
      • 2021-04-23
      • 2018-10-15
      • 1970-01-01
      相关资源
      最近更新 更多