【问题标题】:Laravel - Query scope with relationship objectsLaravel - 使用关系对象查询范围
【发布时间】:2021-04-24 10:56:48
【问题描述】:

我有一个具有多对多关系的雄辩模型,我在其表上存储了一些额外的字段。然后,我使用查询范围来获取这些字段并将它们与我的模型一起返回,如下所示:

public function scopeWithAllocatedPractitioners($query)
    {
        $query->with(['allocated_practitioners' => function ($query)
        {
            $query->select([
                'practitioner_id',
                'completion_status_id',
                DB::raw('ifnull(overtime_hours, 0) as overtime_hours'),
                'avatar',
                'first_name',
                'last_name'
            ]);
        }]);
    }

completion_status_id 字段是指另一个名为 ShiftCompletionStatus 的模型的标识。我想要做的是从该模型中获取其他字段并将它们包含在此查询范围中,以便返回的对象看起来像这样:

allocated_practitioners: [
    {
        "practitioner_id: ...,
        "completion_status": {
              "id": 1,
              "name": "Not started"
        }
        ...
    }
]...

我在想我可以使用一些 DB::raw swag 或者使用 with 回调在我的选择数组中创建对象。这几乎意味着做这样的事情:

public function scopeWithAllocatedPractitioners($query)
{
    $completion_status_object = // somehow get the model instance by getting info from the query
    $query->with(['allocated_practitioners' => function ($query)
    {
        $query->select([
            'practitioner_id',
            'completion_status' => $completion_status_object,
            DB::raw('ifnull(overtime_hours, 0) as overtime_hours'),
            'avatar',
            'first_name',
            'last_name'
        ]);
    }]);
}

但这不起作用...有什么想法吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    你必须使用 whereHas()

    public function scopeWithAllocatedPractitioners($query)
        {
            $query->whereHas('allocated_practitioners', function ($query)
            {
                $query->select([
                    'practitioner_id',
                    'completion_status_id',
                    DB::raw('ifnull(overtime_hours, 0) as overtime_hours'),
                    'avatar',
                    'first_name',
                    'last_name'
                ]);
            }]);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 2018-06-20
      相关资源
      最近更新 更多