【问题标题】:Search in belongsToMany-relation for item by pivot value在 belongsToMany-relation 中按枢轴值搜索项目
【发布时间】:2020-06-02 13:38:17
【问题描述】:

我有这些模型:

  • Order
  • Invoice

一个Order 可以有多个Invoices,一个Invoice 可以属于多个Orders。

例子:

订单:

  • 订单 #1
  • 订单 #2
  • 订单#3

发票:

  • 发票 #1 -> 属于 Order #1Order #2(所以这个 Invoice 包含 Orders)
  • 发票#2 -> 属于Order #2Order #3

每个belongsTo-relation 都保存一个date 作为基准,它定义了此订单开票的最后日期。

现在我想为我的 Order-Model 创建一个 isInvoiceable() getter,无论订单是否在上个月内开具发票,它都会返回。如果最新的date 超过一个月,请返回true,因为此订单应创建新发票。

所以现在我需要你的帮助:我需要检查所有发票,是否有一个 Order (belongsToMany) 和当前 Orderorder_id,以及一个比现在更旧的 date-pivot -一个月。我需要检查order_id,因为Invoice 也可能包含有关其他Orders 的信息。

这对我来说是缺少的链接:如何检查Invoice 中的belongsToMany-relation for dateorder_id

【问题讨论】:

    标签: laravel eloquent laravel-7


    【解决方案1】:

    假设您已将关系定义为“发票”,您可以执行以下操作:

    class Order extends Model {
    
    ...
    
    
    public function isInvoiceable(){
        $lastInvoiceDate = (date('Y-m-d', $this->invoices()->latest()->created_at));
        $today = new Carbon(date('Y-m-d', strtotime(Input::get('startdate'))));
        $diff_months = $lastInvoiceDate->diff($today)->months;
    
        return $diff_months < 1;
    }
    

    【讨论】:

    • 不幸的是,这不起作用,因为发票可以属于多个订单,并且日期在 belongsToMany-relation 中保存为枢轴。
    【解决方案2】:

    有一个wherePivot 方法,它应该做你想做的事。

    来自docs

    通过中间表列过滤关系:

    您还可以使用以下方法过滤 belongsToMany 返回的结果 定义时的 wherePivot、wherePivotIn 和 wherePivotNotIn 方法 关系:

    return $this->belongsToMany('App\Role')->wherePivot('approved', 1);
    
    return $this->belongsToMany('App\Role')->wherePivotIn('priority', [1, 2]);
    
    return $this->belongsToMany('App\Role')->wherePivotNotIn('priority', [1, 2]);
    

    我还没有测试过,但你应该可以做这样的事情:

    public function isInvoiceable()
    {
        // replace 'invoices()' with your relationship
        if ($this->invoices()->wherePivot('date', '>=', Carbon::now()->subMonth())->count() > 0) {
            return false;
        }
    
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      你有两个选择:

      1- 就像 Remul 在他的回答中所说:使用 wherePivot();

      2- 使用 newPivotQuery()

      witch 给你更多的工作空间......

      当您使用此方法时,查询将直接在数据透视表上...

      class Order extends Model {
      
      
      public function isInvoiceable()
      {
      
         return $this->invoices()-> newPivotQuery()->firstWhere('date', '>=', Carbon::now()->subMonth())!=null;
      }
      

      使用 newPivotQuery() 的优势在于您可以插入、更新、进行整体查询...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 2019-05-31
        • 2018-08-28
        • 2022-10-12
        • 2017-04-27
        • 2011-06-26
        • 1970-01-01
        相关资源
        最近更新 更多