【问题标题】:Adding a condition to a long string of object relations in Laravel / Eloquent在 Laravel / Eloquent 中为一长串对象关系添加条件
【发布时间】:2023-03-20 07:15:01
【问题描述】:

基本上我只是想在这个请求中添加一个 where 条件,在那里我得到一个带有一堆孩子的“阶段”(我把它做了一点):

public function show($projectId, $phaseId)
{
    return Phase::with('headers.subheaders.lines.values')->findOrFail($phase);
}

我想做这样的事情:

public function show($projectId, $phaseId)
{
    return Phase::with('headers.subheaders.lines.projectValues')
        ->where('headers.subheaders.lines.projectValues.project_id', '=' , $projectId)
        ->findOrFail($phaseId);
}

我尝试了各种变体:

return Phase::with(['headers.subheaders.lines.projectValues' => function ($query) use ($projectId) {
    $query->where('project_id', $projectId);
}])->findOrFail($phaseId);

但我找不到让其正常工作的神奇语法组合。我通常会收到错误,即 project_id 不是最后一个示例的阶段属性...我尝试给它两次完整路径,但它似乎不喜欢它...也许我只是愚蠢和有一个简单的解决方案...

编辑:

一些关系:

class Line extends Model
{
   // Other stuff
    public function projectValues()
    {
        return $this->hasMany(ProjectValues::class, 'question_id');
    }
}


class QuestionValue extends Model
{
    // Other stuff

    public function project()
    {
        return $this->belongsTo(Project::class);
    }

    public function line()
    {
        return $this->belongsTo(Line::class);
    }
}

【问题讨论】:

  • 您好 Ben,请添加 Phase 模型和 Project 的关系。
  • 阶段和项目没有关系,只是树末尾的值
  • 一行有很多 ProjectValues 但我只想要 Phase 中与我的变量(当前项目)相对应的 ProjectValues @AliAli

标签: php laravel api eloquent


【解决方案1】:

您是否尝试过使用whereHas 链:

 return Phase::with('headers.subheaders.lines.projectValues')
            ->whereHas('headers',function ($query)use($project_id){
                $query->whereHas('subheaders',function ($query2)use($project_id){
                    $query2->whereHas('lines',function ($query3)use($project_id){
                        $query3->whereHas('projectValues',function ($query4)use($project_id){
                            $query4->where('project_id','=',$project_id);
                        });
                    });
                });
            })
            ->findOrFail($phaseId);

【讨论】:

  • 问题是,如果没有问题值我仍然想要这条线......在这种情况下可以吗?
  • questionValue 是什么意思?
  • 那里最细粒度的对象,我们检查 project_id 的地方,我仍然会得到一个 Line,其关系中有 0 ProjectValues 吗? “whereHas()”的措辞听起来好像我不会……
猜你喜欢
  • 2015-11-25
  • 2014-11-15
  • 2018-01-15
  • 2013-02-09
  • 2016-07-13
  • 1970-01-01
  • 2020-10-26
  • 2017-04-20
  • 2021-04-21
相关资源
最近更新 更多