wherePivot组优先级(和/或)

时间:2016-10-21 09:08:33

标签: laravel

我在使用wherePivot和/或优先级时遇到了麻烦。

让我用代码解释。

我有3张桌子:

产品

  • id UNSIGNED INTEGER AUTO_INCREMENT
  • product VARCHAR(255)

客户端

  • id UNSIGNED INTEGER AUTO_INCREMENT
  • client VARCHAR(255)

client_product

  • client_id UNSIGNED INTEGER
  • product_id UNSIGNED INTEGER
  • 价格DECIMAL(9,2)NULL
  • valid_from(DATETIME)NULL
  • valid_until(DATETIME)NULL

我想在特定日期找到客户的产品价格。

我在产品型号中有一个范围:

false

如果产品有价格,那么:

  • valid_from设置了日期,不能为空。
  • valid_until可以为null或设置日期

为了获得产品的价格,我在产品型号上尝试了这两个功能,但都没有用:

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

1 个答案:

答案 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

的位置

这应该有用,过滤器将适用于中间表。