自定义属性在toJSON上崩溃

时间:2017-06-29 15:48:08

标签: laravel laravel-5

我正在尝试确定订单在哪个位置生成订单ID,但这会导致laravel崩溃,日志中没有任何内容,只是浏览器中出现500错误:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Load extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    protected $guarded = ['id', 'created_at', 'updated_at'];

    protected $appends = ['order_no'];

    public function workorder() 
    { 
        return $this->belongsTo('App\WorkOrder', 'work_order_id'); 
    }

    public function getOrderNoAttribute()
    {
        $count = 1;
        foreach ($this->workorder->loads as $load) {
            if ($load->id == $this->id) {
                break;
            }
            $count++;
        }
        return $this->workorder->id . "-" . $count;
    }
}

当我改变它只返回它工作的整数时,所以我几乎可以肯定它是引起问题的关系访问。有没有办法做到这一点更好?

1 个答案:

答案 0 :(得分:0)

通常在定义计算属性时,应避免对关系的依赖。因此,实现您正在尝试的方法的一种方法是(正如您提到的那样解决)是让所有loads具有相同的work_orderid并继续进行。

public function getLoadCountAttribute ()
{
    $id = $this->work_order_id;
    return static::where('work_order_id', $id)->count();
}  

另一种方式,我认为更合乎逻辑的是定义关系和急切负载

//define a relation in your Load model  
public function load_count ()
{
    return count($this->workorder->loads)
    //-1  if you want to exclude the current load from count
    ;
}

//Then use Load::with('load_count') to eager load the load_count
//You may also use global scope

另一种方法是在Workorder模型上定义静态函数,它将接受id并返回load_count

//Workorder model
public static function getLoadCount($id)
{
    $workorder = static::findOrFail($id);
    return count($workorder->loads);
}

希望这有帮助。