子查询中的Laravel withPivot在when子句中不起作用

w6mmgewl  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(257)

当我'直接'应用wherePivot时,它可以工作,但是当我在when子句中应用它时,它不能工作。我得到错误:Column not found: 1054 Unknown column 'pivot' in 'where clause'

return Company::where('owner_id', auth()->user()->id)
    ->with(['subscribers' => function ($q) {
            $q->wherePivot('is_customer', 1); // This works
            $q->when($this->type != 'all', function ($q) {
                $q->wherePivot('is_customer', 1); // This does not
            });
            $q->when($this->example != 'all', function ($q) {
                $q->where('example', 1); // This works
            });
        }
    ])
    ->firstOrFail();
pjngdqdw

pjngdqdw1#

第一个问题是使用同一个变量$q作为内部和外部查询:

Company::where(/* ... */)->with(['subscribers' => function ($q) {
  $q->when($this->type != 'all', function ($q) {
    // ...
  });
});

在第一个执行严修中,$qbelongsToMany,因为Company.php中的public function subscribers()是多对多相关,可能定义为return $this->belongsToMany(Subscriber::class);(或类似)。当您呼叫$q->wherePivot(/* ... */)时,会对枢纽分析表的数据执行查询。
在第二个示例中,$q是一个基本的Builder示例。当您调用$q->wherePivot(/* ... */)时,它将执行一个“魔术方法”查询,该查询在所有Eloquent Model上都可用。where{Column}(),如whereId()whereEmail()wherePivot()等,将执行一个等效的查询,如WHERE id ...WHERE email ...,最后是WHERE pivot ...。由于您没有名为pivot的列,因此此操作失败。
此处的解决方案是不使用相同的变量名,而是在查询时向前传递它:

return Company::where('owner_id', auth()->user()->id)
->with(['subscribers' => function ($query) {
  $query->when($this->type != 'all', function ($subQuery) use ($query) {
    $query->wherePivot('is_customer', 1);
  });
])
->firstOrFail();

现在,您可以清楚地看到调用了哪个示例wherePivot()$querybelongsToMany()查询,$subQueryBuilder示例,并且没有直接使用。

相关问题