我正在尝试确定订单在哪个位置生成订单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;
}
}
当我改变它只返回它工作的整数时,所以我几乎可以肯定它是引起问题的关系访问。有没有办法做到这一点更好?
答案 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);
}
希望这有帮助。