我在使用wherePivot和/或优先级时遇到了麻烦。
让我用代码解释。
我有3张桌子:
产品
客户端
client_product
我想在特定日期找到客户的产品价格。
我在产品型号中有一个范围:
false
如果产品有价格,那么:
为了获得产品的价格,我在产品型号上尝试了这两个功能,但都没有用:
public function clients()
{
return $this->belongsToMany('Client', 'client_product', 'product_id', 'client_id')
->withPivot('price', 'valid_from', 'valid_until');
}
我收到此错误:
public function findPrice($clientId, $date)
{
return $this->clients()
->where('client_id', $clientId)
->where('valid_from', '<=', $date)
->where(function($query) use ($date) {
$query->wherePivot('valid_until', '>=', $date)
->orWherePivot('valid_until', '=', NULL);
})
->first();
}
另外,我不能使用
[Illuminate\Database\QueryException]
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pivot' in 'where clause'
我收到此错误:
public function findPrice($clientId, $date)
{
return $this->clients()
->where('client_id', $clientId)
->where('valid_from', '<=', $date)
->wherePivot(function($query) use ($date) {
$query->where('valid_until', '>=', $date)
->orWhereNull('valid_until');
})
->first();
}
因为'wherePivot'方法只将字符串作为第一个参数而不是Closure作为'where'方法
[ErrorException]
Object of class Closure could not be converted to string
答案 0 :(得分:1)
你可以在没有wherePivot的情况下完成它,只需在查询中使用where()并用列名指定你的中间表名,所以在where子句中它会将列视为中间表为ex。
public function findPrice($clientId, $date)
{
return $this->clients()
->where('client_id', $clientId)
->where('valid_from', '<=', $date)
->where(function($query) use ($date) {
$query->where('client_product.valid_until', '>=', $date)
->orWhere('client_product.valid_until', '=', NULL);
})
->first();
}
考虑client_product.valid_until
的位置这应该有用,过滤器将适用于中间表。