【问题标题】:laravel scope model function errorlaravel范围模型功能错误
【发布时间】:2016-07-17 08:22:14
【问题描述】:

我正在尝试使用 laravel 中的范围来汇总属于特定 cash_sale 的所有 cash_sales_items。问题是当我在这些表中有一些信息时,代码可以正常工作,但是当表为空时,我得到一个错误

Object of class Illuminate\Database\Eloquent\Builder could not be converted to string  

下面是代码和表结构

accessories_cash_salesmysql> describe accessories_cash_sales;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id            | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| client        | varchar(255)     | NO   |     |         |                |
| exchange_rate | int(11)          | NO   |     | 0       |                |
| employee_id   | int(10) unsigned | NO   | MUL | NULL    |                |
| status        | varchar(255)     | NO   |     |         |                |
| tax           | varchar(255)     | NO   |     |         |                |
| created_at    | timestamp        | YES  |     | NULL    |                |
| updated_at    | timestamp        | YES  |     | NULL    |                |
+---------------+------------------+------+-----+---------+----------------+

另一个是

mysql> describe accessories_cash_sales_items;
+--------------------------+------------------+------+-----+---------+----------------+
| Field                    | Type             | Null | Key | Default | Extra          |
+--------------------------+------------------+------+-----+---------+----------------+
| id                       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| accessories_id           | int(10) unsigned | NO   | MUL | NULL    |                |
| quantity                 | int(11)          | NO   |     | 0       |                |
| amount                   | int(11)          | NO   |     | 0       |                |
| accessories_cash_sale_id | int(10) unsigned | NO   | MUL | NULL    |                |
| created_at               | timestamp        | YES  |     | NULL    |                |
| updated_at               | timestamp        | YES  |     | NULL    |                |
+--------------------------+------------------+------+-----+---------+----------------+

我在刀片模板中调用范围方法

\App\AccessoriesCashSale::paidOrCollected()

在现金销售模式中,paidOrCollected 函数看起来像

public function scopePaidOrCollected($query){
    $amount = 0;
    $items = $query->where('status', '=', 'paid')->orWhere('status', '=', 'Collected')->whereMonth('created_at','=', date('m'))->get();

    foreach($items as $item){
        $amount = $amount + $item->accessoriesCashSalesItems()->sum('amount');;
    }

    return $amount;
}

【问题讨论】:

    标签: laravel laravel-blade laravel-query-builder


    【解决方案1】:

    在使用范围时,您应该始终返回修改后的查询对象。

    public function scopePaidOrCollected($query){
        return $query->where('status', '=', 'paid')->orWhere('status', '=', 'Collected')->whereMonth('created_at','=', date('m'));
    }
    

    使用您的范围过滤您的查询结果,然后将其传递给范围之外的另一个方法来迭代您的集合并计算出您的数量。

    编辑

    您可以简单地在模型中添加另一个方法来处理您的范围数据,如下所示:

    public function getCashSaleAmounts()
    {
        $items = AccessoriesCashSale::paidOrCollected()->get();
        $amount = 0;
    
        foreach($items as $item){
            $amount += $item->accessoriesCashSalesItems()->sum('amount');
        }
    
        return $amount;
    }
    

    但是,您可能希望在尝试循环之前检查结果。

    【讨论】:

    • 但这意味着我必须将 foreach 循环放在视图中。问题是我试图像仪表板一样创建,我的计划是实现模型中的所有功能并且只返回值而不是在视图中放置太多代码
    • @williamjingo 范围用于将范围应用于查询对象并将对象传回,您将在范围内返回查询结果,迭代它们并返回完全不同的内容。您不需要从视图内部调用循环,您可以向模型添加另一个方法,该方法调用范围结果,循环它们并返回您的金额。
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多